JsValue过滤掉空值

时间:2018-06-08 17:02:09

标签: scala playframework play-json

我想弄清楚如何避免null值。我的问题是,我正在查询API并返回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)
    )
}

我遇到的问题是asOptinnerValue转换为None,而转移到Some(null)。我明白为什么,这很有道理。但我需要找到一种方法来处理它。比Some(null)的匹配更优雅。我非常感谢任何想法。

2 个答案:

答案 0 :(得分:3)

考虑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)
}

答案 1 :(得分:1)

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

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

我认为Mario的方式更清晰,应该被推荐,但在我的情况下,这意味着重写10个案例类,我修改现有代码的方式更快。不过,这就是我将马里奥的答案标记为公认答案的原因。