【问题标题】:Scala Play - Json ParseScala Play - Json 解析
【发布时间】:2018-07-17 16:20:06
【问题描述】:


我从外部服务接收 JSON,我的目标是完全按原样解析它。
主要问题是:一个值可以为空,也可以不存在,但null 具有不同的不存在含义。所以我想以某种方式抓住这个。
例如这个 JSON:

{
  "a": null,
  "b": 1
}

与这个不同:

{
  "b": 1
}

你能帮帮我吗?

更新:
抱歉更新延迟。无论如何:你是对的,我在中间有一个隐式的自定义读取,目前我使用 "a".readNullable[Double]"a".write[Option[Double]] 并且案例类类似于:

case class Example(a: Option[Double])

【问题讨论】:

  • 你想捕捉这种差异是什么意思? val json = Json.parse("""{"a": null, "b": 1}""") 不同于 val json = Json.parse("""{"b": 1}""" )
  • 抱歉,可能是我忘记添加重要的部分了。我有一个隐式读取(readNullable)和一个隐式写入(writeNullable)。
  • 对...所以你有这样的案例类case class Yolo(a: Option[Int], b: Int)?
  • 看看这里 playframework.com/documentation/2.6.x/… 它说对可能丢失或为空的路径使用 readNullable
  • 正如@mfirry 提到的,Json.parse 已经捕捉到了差异。如果您在此过程的后期遇到问题(可能是 as[...] 或 validate[..]?),请发布给您带来问题的实际代码。

标签: json scala parsing playframework null


【解决方案1】:

通过一个详细的示例(play-json 2.6)来说明@mfirry 所说的内容:

scala> import play.api.libs.json._
import play.api.libs.json._

scala> val json1 = Json.parse("""{"a": null, "b": 1}""")
json1: play.api.libs.json.JsValue = {"a":null,"b":1}

scala> val json2 = Json.parse("""{"b": 1}""")
json2: play.api.libs.json.JsValue = {"b":1}

scala> (json1 \ "a").isDefined
res8: Boolean = true

scala> (json1 \ "a") == JsDefined(JsNull)
res3: Boolean = true

scala> (json2 \ "a").isDefined
res7: Boolean = false

scala> (json2 \ "a")
res5: play.api.libs.json.JsLookupResult = JsUndefined('a' is undefined on object: {"b":1})

【讨论】:

    猜你喜欢
    • 2021-05-13
    • 2016-07-12
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多