使用json4s解析JSON中的空值

使用json4s解析JSON中的空值,json,scala,lift,json4s,Json,Scala,Lift,Json4s,我在项目中使用库逐个字段手动解析JSON(而不自动将其反序列化为案例类) 例如,我有以下JSON: { result: "OK", persons: [ {name: "Alex"}, {name: null} ] } 官方指南建议使用这种方法手动解析: for { JArray(persons) <- json / "persons" JObject(person) <- persons JFie

我在项目中使用库逐个字段手动解析JSON(而不自动将其反序列化为案例类)

例如,我有以下JSON:

{
  result: "OK",
  persons: [
    {name: "Alex"},
    {name: null}
  ] 
}
官方指南建议使用这种方法手动解析:

for {
         JArray(persons) <- json / "persons"
         JObject(person) <- persons
         JField("name", JString(name)) <- person
       } yield Person(name) 
用于{

JArray(persons)是的,你已经知道了它不能工作的原因,你只需要像下面这样改变模式匹配

case class Person(name: String)
// the result is actually List[Option[Person]]
val result =
  for {
    JArray(persons) <- json \ "persons"
    JObject(person) <- persons
    // jv is JsonAST.JValue
    JField("name", jv) <- person
  } yield {
    // in case of match error so add _ here
    jv match {
      case JString(name) => Some(Person(name))
      case JNull => Some(Person(null))
      case _ => None
    }
  }
这样就可以了

 val r:List[Person] = for {
    JArray(persons) <- JsonMethods.parse(json) \ "persons"
    JObject(person) <- persons
    //JField("name", JString(name)) <- person
   p = Person(person.head._2) //or Person(person.find(_._1=="name").map(_._2).getOrElse(null))
  } yield p

  println(r) //List(Person("Alex"), Person(null))
val r:List[Person]=for{

JArray(个人)你能复制一下你对这个问题的回答吗:我在那里开了赏金公司,我可以这么做,但说真的,我认为你不值得“付钱”我还想问:我的JSON的每个字段都可能是空的,我有大约15个感兴趣的字段,所以我似乎需要用这种模式匹配替换每个字段的提取(5行而不是1行代码).有没有比模式匹配更简洁的方法?第二种方法不适合我(我在创建case类之前对提取的字段进行了大量转换)是的,我明白了。所以15个字段都是相同类型的,比如JString?你最好提供json的结构,否则其他人很难帮助你。
 val r:List[Person] = for {
    JArray(persons) <- JsonMethods.parse(json) \ "persons"
    JObject(person) <- persons
    //JField("name", JString(name)) <- person
   p = Person(person.head._2) //or Person(person.find(_._1=="name").map(_._2).getOrElse(null))
  } yield p

  println(r) //List(Person("Alex"), Person(null))