使用json4s解析JSON中的空值
我在项目中使用库逐个字段手动解析JSON(而不自动将其反序列化为案例类) 例如,我有以下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
{
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))