使用json4s

时间:2015-09-06 21:35:21

标签: json scala lift json4s

我在我的项目中使用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}

2 个答案:

答案 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