JSON 引号使解析变得不可能

JSON quotes make parsing impossible

我正在使用 play 的 json 库来解析 javascript 发送给我的 json。在初始测试期间一切正常,但我发现各种前端发送 json 值裸露或用引号括起来。这可能会不时更改,因此我的解析失败,因为看起来像浮点数的数据在下一个看起来像字符串。

我正在使用隐式读取来解析模型并且真的想继续这样做。目前我有:

case class dsource (
                     A: String,
                     B: Int,
                     C: Float,
                     D: Float,
                     E: Float,
                     F: Float,
                     G: Float
                   )

object dsource {
  implicit val dsourceaReads: Reads[dsource] = (
    (JsPath \ "A").read[String] and
      (JsPath \ "B").read[String].map(_.toInt) and
      (JsPath \ "C").read[String].map(_.toFloat) and
      (JsPath \ "D").read[String].map(_.toFloat) and
      (JsPath \ "E").read[Float] and
      (JsPath \ "F").read[Float] and
      (JsPath \ "G").read[Float]
  ) (dsource.apply _)
}}

我想避免对 Json 进行预处理并且我无法控制前端发送给我的内容,我需要处理该值是否包含在引号中。我想这是将弱类型前端发送到强类型后端的挑战。

有什么建议吗?

提前致谢。

您可以创建助手:

val maybeQuotedInt: Reads[Int] = Reads { 
  js => js.validate[String].map(_.toInt).orElse(js.validate[Int])
}
// similar for Float/Double/etc

然后将它们用作

(JsPath \ "A").read[String] and
  (JsPath \ "B").read(maybeQuotedInt) and
  (JsPath \ "C").read(maybeQuotedFloat) and ...

这未经测试,仅来自文档,因此可能需要进行一些更改,但这种方法应该有效。