Skip to content

Instantly share code, notes, and snippets.

@seance
Created May 10, 2017 07:55
Show Gist options
  • Save seance/f0d211086b1cd8f31b6c523e310312f9 to your computer and use it in GitHub Desktop.
Save seance/f0d211086b1cd8f31b6c523e310312f9 to your computer and use it in GitHub Desktop.
import play.api.libs.json._
import play.api.libs.json.Reads._
import play.api.libs.functional.syntax._
import scala.util.control.Exception._
object Main extends App {
case class Person(name: String, height: Double)
val goodJson = Json.parse("""
{
"foo": "bar",
"baz": "1.4"
}
""")
val badJson = Json.parse("""
{
"foo": "bar",
"baz": "Unparseable"
}
""")
def toNum(implicit r: Reads[String]) = Reads[JsNumber](
r.reads(_).flatMap(s =>
allCatch.either(s.toDouble).fold(
_ => JsError("error.expected.jsnumber"),
d => JsSuccess(JsNumber(d)))))
val readPerson = (
(__ \ 'foo).read[String] ~
(__ \ 'baz).json.update(toNum).andThen(
(__ \ 'baz).read[Double]
)
)(Person)
println(goodJson.validate[Person](readPerson)) // JsSuccess(Person(bar,1.4),)
println(badJson.validate[Person](readPerson)) // JsError(List((/baz,List(ValidationError(List(error.expected.jsnumber),WrappedArray())))))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment