从Json响应-Scala-Play解析数字或字符串值

从Json响应-Scala-Play解析数字或字符串值,json,scala,playframework,Json,Scala,Playframework,我知道这不应该发生,但第三方API正在返回JSON响应,其字段与Double/Float或字符串完全相同。在关于“我们为什么生活在这样一个世界”的许多内部辩论之后,我正在努力寻找一种方法来解析这样一种回应: implicit val inconsistentReads: Reads[InconsistentItem] = ( (JsPath \ "field").readNullable[String] ... )(InconsistentItem.apply _) 当这个函数运行时,我

我知道这不应该发生,但第三方API正在返回JSON响应,其字段与Double/Float或字符串完全相同。在关于“我们为什么生活在这样一个世界”的许多内部辩论之后,我正在努力寻找一种方法来解析这样一种回应:

implicit val inconsistentReads: Reads[InconsistentItem] = (
  (JsPath \ "field").readNullable[String] ... 
)(InconsistentItem.apply _)
当这个函数运行时,我会得到“play.api.libs.json.JsResultException:JsResultException”,而这个字段有时会作为数值返回

无论Json响应中是数字还是字符串,都可以将其作为字符串读入吗


这是针对Scala in-Play框架的。非常感谢

试试这样的东西。因为您没有定义什么是
不一致项
,所以我使用
或者

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))

试试这样的。因为您没有定义什么是
不一致项
,所以我使用
或者

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))

更通用的Reads[任一]定义:更通用的Reads[任一]定义: