首页 > 解决方案 > JsValue 过滤掉空值

问题描述

我试图弄清楚如何避免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)
    )
}

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

标签: scalaplayframeworkplay-json

解决方案


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

推荐阅读