scala - JsValue 过滤掉空值

标签 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)
    )
}

我遇到的问题是 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)
}

关于scala - JsValue 过滤掉空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50765383/

相关文章:

scala - 如何使用异步阶段创建 Akka 流真正的拉流

rest - Play Framework CRUD

Java Play框架解析JSON错误

scala - 函数式语言(Erlang、F#、Haskell、Scala)

Scala:具有多个来源和异构类型的交叉(笛卡尔)积

xml - Scala - 如何提取通用文本文件中包含的 XML 文件

java - 从网页查看日志

json - 没有用于Option [String]的Json格式化程序?

scala - Play JsPath 为 Infinite Double 编写