我使用Scala案例类和Play"格式"验证JSON消息。例如:
case class Person(name: String)
implicit val formatPerson = Json.format[Person]
以下JSON:
{
"name": "Alice"
}
将通过方法验证
Json.validate[Person](json)
现在我想用字段" x"来验证JSON消息。可以是String或Integer。 例如,以下两条消息都将使用相同的方法进行验证:
{
"x": "hello"
}
{
"x": 8
}
我尝试了以下技巧,但它不起作用:
case class Foo(x: Either[String,Int])
implicit val formatFoo = Json.format[Foo]
当我尝试定义Foo类的格式时,编译器说:"找不到匹配unapply参数"的应用函数。提前谢谢。
答案 0 :(得分:3)
您必须定义自定义Format[Foo]
。这适用于Play 2.4
implicit val formatFoo = new Format[Foo]{
override def writes(o: Foo): JsValue = o.x match {
case Left(str) => Json.obj("x" -> str)
case Right(n) => Json.obj("x" -> n)
}
override def reads(json: JsValue): JsResult[Foo] = json \ "x" match {
case JsDefined(JsString(str)) => JsSuccess(Foo(Left(str)))
case JsDefined(JsNumber(n)) if n.isValidInt => JsSuccess(Foo(Right(n.toInt)))
case _ => JsError("error")
}
}