Skip to content

Instantly share code, notes, and snippets.

@julien-lafont
Last active December 11, 2015 19:48
Show Gist options
  • Save julien-lafont/02dca6d1b77f0be6bf72 to your computer and use it in GitHub Desktop.
Save julien-lafont/02dca6d1b77f0be6bf72 to your computer and use it in GitHub Desktop.
package controllers
import play.api._
import play.api.mvc._
import play.api.libs.json._
import play.api.libs.functional.syntax._
object RichJs {
implicit class RichJsPath(js: JsPath) extends JsPath {
// Read T element or try to convert from String
def readStringified[T](toT: String => T)(implicit r: Reads[T], rS: Reads[String]): Reads[T] =
Reads.at[T](js)(r) orElse Reads.at[String](js)(rS).map(toT(_)) // There is certainly a way to use automatic conversion...
// Read Int and fallback to String conversion
def readStringifiedInt: Reads[Int] = readStringified[Int](_.toInt)
}
}
case class Example(name: String, number: Int)
object Example {
import RichJs._
implicit val formater = (
(__ \ 'name).format[String] and
(__ \ 'number).format((__).readStringifiedInt)
)(Example.apply _, unlift(Example.unapply _))
}
object Application extends Controller {
def index = Action {
val json1 = Json.obj("name" -> "Julien", "number" -> 1000).as[Example]
val json2 = Json.obj("name" -> "Julien", "number" -> "1000").as[Example]
Ok(Json.toJson(json2))
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment