我知道这不应该发生,但第三方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。非常感谢!
答案 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))