使用Lift-JSON解析动态值

时间:2010-05-22 15:08:17

标签: json scala lift

让我用一个例子来解释这个问题。如果我有以下JSON:

  

{“person1”:{“name”:“Name One”,   “地址”:{“街道”:“有些人   街道“,”城市“:”某些城市“}},
  “person2”:{“name”:“Name Two”,   “地址”:{“街道”:“其他一些   街道“,”城市“:”其他城市“}}}

[对人数没有限制,输入JSON可以有更多人]

我可以通过

将这个JSON提取到Persons对象
  

var persons = parse(res).extract [T]

以下是相关案例类:

  

案例类地址(街道:字符串,   city:String)
  案例类人员(姓名:   字符串,地址:地址,儿童:   列表[儿童])
  案例类   人(人1:人,人2:   人)

问题:上述情况完全正常。然而,需要的是密钥/值对中的密钥是动态的。因此,在提供的示例JSON中, person1 person2 可以是任何内容,我需要动态地读取它们。对于人类来说,最好的结构是什么才能解释这种动态性质。

1 个答案:

答案 0 :(得分:7)

解析它的一种方法是映射根JSON对象的子元素:

scala> parse(res).children.map(_.extract[Person])
res3: List[Person] = List(Person(Name One,Address(Some Street,Some City)), Person(Name Two,Address(Some Other Street,Some Other City)))

或者像这样,如果你需要保留字段名称:

scala> Map() ++ parse(res).children.map { case f: JField => (f.name, f.extract[Person]) }
res4: scala.collection.immutable.Map[String,Person] = Map(person1 -> Person(Name One,Address(Some Street,Some City)), person2 -> Person(Name Two,Address(Some Other Street,Some Other City)))

注意,当我们开始使用2.8功能时,以下直接方式应该有效:

parse(res).extract[Map[String, Person]]