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 ...
这未经测试,仅来自文档,因此可能需要进行一些更改,但这种方法应该有效。
我正在使用 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 ...
这未经测试,仅来自文档,因此可能需要进行一些更改,但这种方法应该有效。