Create a gist now

Instantly share code, notes, and snippets.

@studiodev /RichJsPath.scala Secret
Last active Dec 11, 2015

What would you like to do?
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] =[T](js)(r) orElse[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]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment