scala - 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)
。我非常感谢任何想法。
解决方案
考虑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)
}
推荐阅读
- visual-studio-code - Visual Studio Code Jupyter 不显示亚洲语言字符
- flutter - 图像选择器在颤振项目中不起作用
- spring - 使用 SSH 密钥访问 GIT 存储库的 Spring 云配置服务器需要进行身份验证,但尚未注册 CredentialsProvider
- http - http 请求适用于 .pdf 但损坏 .docx 和 .xlsx 文件
- javascript - export default 中的 props 有什么作用?
- google-apps-script - 从谷歌工作表单元格访问数据时应用程序脚本异常缓慢
- javascript - 对象没有出现在组件 React Bootstrap/CSS 的中间
- javascript - 复选框中的 React-hook-form 自定义 onChange 处理程序->未注册更改
- python - 如何在 Pandas 中进行累积分组直到特定条件中断?
- swift - 需要变量作为参数/参数?