Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Lift-JSON解析动态值_Json_Scala_Lift - Fatal编程技术网

使用Lift-JSON解析动态值

使用Lift-JSON解析动态值,json,scala,lift,Json,Scala,Lift,让我用一个例子来解释这个问题。如果我有一个JSON,如下所示: {“person1”:{“name”:“name One”, “地址”:{“街道”:“一些” 街道,“城市”:“某个城市”}, “人名2”:{“姓名”:“姓名2”, “地址”:{“街道”:“其他一些” 街道、“城市”:“其他城市”}}} [人数没有限制,输入JSON可以有更多的人] 我可以通过执行以下操作将此JSON提取到Persons对象 var persons=parse(res).extract[T] 以下是相关的案例类别:

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

{“person1”:{“name”:“name One”, “地址”:{“街道”:“一些” 街道,“城市”:“某个城市”},
“人名2”:{“姓名”:“姓名2”, “地址”:{“街道”:“其他一些” 街道、“城市”:“其他城市”}}}

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

我可以通过执行以下操作将此JSON提取到Persons对象

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

以下是相关的案例类别:

案例类别地址(街道:字符串, 城市:字符串)
案例类人员(姓名: 字符串,地址:地址,子项: 列表[子项]
案例类 人员(人员1:人员,人员2: (人)


问题:上述场景效果非常好。然而,需要的是键/值对中的键是动态的。因此,在提供的JSON示例中,person1和person2可以是任何东西,我需要动态读取它们。Persons类解释这种动态特性的最佳结构是什么。

一种解析方法是映射根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上做得很好,简直棒极了。我很想在根级别使用地图和列表,希望不久的将来。谢谢Surya!我也在急切地等待完全过渡到2.8。我想我们将在Lift 2.0发布后开始使用2.8特性(第一个候选版本即将推出)。嗨,Joni,Lift json现在做根映射对象了吗?我在Scala 2.8.1中使用的是lift 2.2,我似乎没有这个功能嗨,是的,它有。不过你需要2.3升。