我在我的项目中使用json4s库来逐字段手动解析JSON(不自动将其反序列化为case类)。
例如我有以下JSON:
{
result: "OK",
persons: [
{name: "Alex"},
{name: null}
]
}
官方指南建议使用此方法手动解析它:
for {
JArray(persons) <- json / "persons"
JObject(person) <- persons
JField("name", JString(name)) <- person
} yield Person(name)
问题在于,这种理解会跳过名称为null
的人。我认为这是因为在理解中我使用了JString(name)
,因此它需要一些String
值,而不是null
。
有什么方法可以解决这个问题吗?我只想迭代数组并访问每个对象(即使它有null
而不是String
}
答案 0 :(得分:2)
是的,你已经有了它无法工作的原因,你只需改变模式匹配,如下所示。
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
}
}
实际上,您提到的文档中的Extracting values部分之后还有另一种更简单的方法。
case class Person(name: String)
import org.json4s.DefaultFormats
implicit val formats = DefaultFormats // Brings in default date formats etc
val result2 = (json \ "persons").extract[List[Person]]
// List(Person(Alex), Person(null))
println(result2)
答案 1 :(得分:0)
这样做,
standalone/deployment