播放2 Json格式,捕获Int或String

时间:2015-08-25 17:02:41

标签: json scala playframework

我有一个问题,我使用一个休息webservice而不是返回一个格式不正确的json,有时返回一个字符串,有时在同一个字段中是一个整数。这是格式的代码:

implicit val ItemFormat: Format[Item] = (
  (JsPath \ "a").format[String] and
    (JsPath \ "b").format[String] and
    (JsPath \ "c").formatNullable[String]
  )(Item.apply , unlift(Item.unapply))

如果c为空或不存在或者字符串运行良好,但如果c是整数,则会出现此错误: ValidationError(列表(error.expected.jsstring),WrappedArray()))

如果c是整数,我会得到,或者用字符串转换它或者把c =无

1 个答案:

答案 0 :(得分:4)

你可以这样做。

case class Item(a: String, b: String, c: Option[String])

implicit val reads: Reads[A] = new Reads[A] { 
  override def reads(json: JsValue): JsResult[A] = { 
    for {
      a <- (json \ "a").validate[String]
      b <- (json \ "b").validate[String]
    } yield {
      val cValue = (json \ "c")
      val cOptString = cValue.asOpt[String].orElse(cValue.asOpt[Int].map(_.toString))
      Item(a, b, cOptString)
    }
  }
}