从Json响应中解析数字或字符串值 - Scala - 播放

时间:2016-12-12 19:49:32

标签: json scala playframework

我知道这不应该发生,但第三方API正在返回JSON响应,其字段与Double / Float或String完全相同。经过多次内部辩论“为什么我们生活在这样一个世界”之后,我很难找到解决这种反应的方法:

implicit val inconsistentReads: Reads[InconsistentItem] = (
  (JsPath \ "field").readNullable[String] ... 
)(InconsistentItem.apply _)

当这个运行时,当有时将字段作为数值返回时,我得到“play.api.libs.json.JsResultException:JsResultException”。

是否有可能以字符串形式读取它,无论它是JSON响应中的数字还是字符串?

这适用于Play框架中的Scala。非常感谢!

1 个答案:

答案 0 :(得分:4)

尝试这样的事情。由于您没有定义InconsistentItem是什么,我使用Either

val inconsistentReads = Reads[Either[String, BigDecimal]] {
     case JsNumber(a) => JsSuccess(Right(a))
     case JsString(a) => JsSuccess(Left(a))
     case _ => JsError("Type not supported")
     }

示例:

Json.parse("\"hi\"").validate[Either[String, BigDecimal]](inconsistentReads)
# JsSuccess(Left("hi"))
Json.parse("1").validate[Either[String, BigDecimal]](inconsistentReads)
# JsSuccess(Right(1))