首页 文章

使用Lift-JSON解析动态值

提问于
浏览
3

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

{“person1”:{“name”:“Name One”,“address”:{“street”:“Some Street”,“city”:“Some City”}},“person2”:{“name”: “姓名二”,“地址”:{“街道”:“其他街道”,“城市”:“其他城市”}}}

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

我可以通过这样做将这个JSON提取到Persons对象

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

以下是相关的案例类:

case class Address(street:String,city:String)case类Person(name:String,address:Address,children:List [Child])case class Persons(person1:person,person2:Person)

Question: 以上情况完美无缺 . 然而,需要的是密钥/值对中的密钥是动态的 . 所以在提供的示例JSON中,person1和person2可以是任何东西,我需要动态地读取它们 . 人类课程考虑到这种动态性质的最佳结构是什么 .

1 回答

  • 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]]
    

相关问题