JsValue 过滤掉空值

JsValue filter out null values

我想弄清楚如何避免 null 值。我的问题是,我正在查询一个 API 并且它 returns 一个 null 值。

这是一个例子:

import play.api.libs.json._

case class InnerExample(value: String)

object InnerExample {
def fromJson(json: JsValue) = InnerExample(
    value = (json \ "value")as[String]
}

case class Example(innerValue: Option[InnerExample])

object Example {
def fromJson(json: JsValue) = Example(
    optionalValue = (json \ "innerValue").asOpt[String].map(InnerExample.apply)
    )
}

我遇到的问题是 asOpt 没有将 innerValue 转换为 None,而是转换为 Some(null)。我明白为什么,这很有意义。但我需要想办法对付它。比匹配 Some(null) 更优雅的东西。我非常感谢任何想法。

考虑readNullable。这是工作示例:

import play.api.libs.json._

case class InnerExample(value: String)
case class Example(innerValue: Option[InnerExample])

object InnerExample {
  implicit val format = Json.format[InnerExample]
}

object Example {
  implicit val jsonread: Reads[Example] =
    (JsPath \ "innerValue").readNullable[InnerExample].map(Example.apply)
}

object NullableJson extends App {
  val jsonSomeStr = """{ "innerValue": { "value": "woohoo" } }"""
  val jsonSome = Json.parse(jsonSomeStr).as[Example] 
  println(jsonSome) // Example(Some(InnerExample(woohoo)))

  val jsonNullStr = """{ "innerValue": null }"""
  val jsonNull = Json.parse(jsonNullStr).as[Example]
  println(jsonNull) // Example(None)
}

感谢@Mario Galic 的回答,我回到我的代码并打开了 JSLookups 的文档,这是我在使用 JsValue 的方法 \ 时得到的结果.事实证明它确实有办法处理 null 值。它是这样完成的:

optionalValue = (json \ "innerValue").validateOpt[String].get.map(InnerExample.apply)

我认为 Mario 的方法更简洁,应该推荐使用,但在我的情况下,这意味着重写 10 个案例 类 并且我的方法在修改现有代码时速度更快。不过,这就是我将 Mario 的答案标记为已接受答案的原因。