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 的答案标记为已接受答案的原因。
我想弄清楚如何避免 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 的答案标记为已接受答案的原因。