播放:使用可能有多种类型的字段验证JSON

时间:2015-11-24 17:09:38

标签: json scala playframework

我使用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参数"的应用函数。提前谢谢。

1 个答案:

答案 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")
  }
}