【问题标题】:Parsing a dynamic value with Lift-JSON使用 Lift-JSON 解析动态值
【发布时间】:2011-02-22 17:37:43
【问题描述】:

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

{"person1":{"name": "名字一", “地址”:{“街道”:“一些 Street","city": "Some City"}},
"person2":{"name": "名字二", “地址”:{“街道”:“其他一些 Street","city": "Some Other City"}}}

[人数不限,输入JSON可以多人]

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

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

以下是相关案例类:

案例类地址(street: String, 城市:字符串)
案例类人(姓名: 字符串,地址:地址,孩子: 列表[儿童])
案例类 人(人1:人,人2: 人)

问题: 上述场景运行良好。然而,需要的是键在键/值对中是动态的。所以在提供的 JSON 示例中,person1person2 可以是任何东西,我需要动态读取它们。对于 Persons 类来说,考虑这种动态性质的最佳结构是什么。

【问题讨论】:

    标签: json scala lift


    【解决方案1】:

    一种解析方法是映射根 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]]
    

    【讨论】:

    • 太棒了!这就像魅力一样。顺便说一句,您在 lift-json 方面做得很好,简直太棒了。我很想在根级别使用地图和列表,希望很快。
    • 谢谢苏利亚!我也急切地等待完全过渡到 2.8。我想我们将在 Lift 2.0 发布后开始使用 2.8 的功能(第一个候选版本即将发布)。
    • 嗨 Joni,lift-json 现在可以做根 Map 对象了吗?我正在为 Scala 2.8.1 使用 lift 2.2,但我似乎没有那个功能
    • 嗨,是的。不过你需要电梯 2.3。