代码之家  ›  专栏  ›  技术社区  ›  SomeStranger314

jsValue筛选出空值

  •  2
  • SomeStranger314  · 技术社区  · 7 年前

    我想知道如何避免 null 价值观。我的问题是,我正在查询一个API,它返回一个 无效的 值。

    下面是一个例子:

    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) .我明白为什么,这很有道理。但我需要想出一个解决办法。比搭配更优雅的东西 一些(空) .我非常感谢你的任何想法。

    2 回复  |  直到 7 年前
        1
  •  3
  •   Mario Galic    7 年前
    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)
    }
    
        2
  •  1
  •   SomeStranger314    7 年前

    \ JsValue null

    optionalValue = (json \ "innerValue").validateOpt[String].get.map(InnerExample.apply)