首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JsValue过滤掉空值

JsValue过滤掉空值
EN

Stack Overflow用户
提问于 2018-06-09 01:02:09
回答 2查看 623关注 0票数 2

我正在尝试找出如何避免null值。我的问题是,我正在查询一个API,它返回一个null值。

下面是一个例子:

代码语言:javascript
复制
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)更优雅的东西。我非常感谢您的任何想法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-09 03:20:14

readNullable为例。以下是工作示例:

代码语言:javascript
复制
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)
}
票数 3
EN

Stack Overflow用户

发布于 2018-06-11 01:24:24

感谢@Mario Galic的回答,我回到了我的代码中,打开了JSLookups的文档,这就是我使用JsValue\方法时得到的结果。事实证明,它确实有一种方法来处理null-values。它是这样做的:

代码语言:javascript
复制
optionalValue = (json \ "innerValue").validateOpt[String].get.map(InnerExample.apply)

我认为Mario的方法更干净,应该推荐,但在我的例子中,这意味着重写10个case类,并且我的方法在修改现有代码时速度更快。尽管如此,这也是我将Mario的答案标记为可接受答案的原因。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50765383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档