Oli*_*ntz 4 xml json scala lift xml-serialization
我正在使用scala/lift作为Rest API.在引擎盖下,我正在生成xml,它将通过Xml.toJson()转换为json作为输出.
现在我注意到一些奇怪的行为让我疯狂.
例如,我有以下xml:
<data>
<item>
<foo>1</foo>
<bar>1</bar>
</item>
<item>
<foo>2</foo>
<bar>2</bar>
</item>
</data>
Run Code Online (Sandbox Code Playgroud)
xml.toJson()的结果如下所示:
JObject(
List(
JField(
data,JObject(
List(
JField(item,
JArray(
List(
JObject(
List(
JField(foo,JString(1)),
JField(bar,JString(1)))
),
JObject(
List(
JField(foo,JString(2)),
JField(bar,JString(2))
)
)
)
)
)
)
)
)
)
)
Run Code Online (Sandbox Code Playgroud)
但如果我添加一个新的xml元素:
<data>
<baz>234</baz>
<item>
<foo>1</foo>
<bar>1</bar>
</item>
<item>
<foo>2</foo>
<bar>2</bar>
</item>
</data>
Run Code Online (Sandbox Code Playgroud)
关于JArray的结果是不同的:
JObject(
List(
JField(data,JObject(
List(
JField(baz,JString(234)),
JField(item,JObject(
List(
JField(foo,JString(1)),
JField(bar,JString(1))
))
),
JField(item,JObject(
List(
JField(foo,JString(2)),
JField(bar,JString(2))
))
)
)
))
)
Run Code Online (Sandbox Code Playgroud)
)
数组未定义,我有两个名为"item"的对象.这是正常行为吗?我想让数组没有包装一些"项目"标签.
是的,这是预期的行为:如果它们都具有相同的名称,net.liftweb.json.Xml则只将子元素分组为a JArray.您可以尝试通过操纵生成的JSON来解决此问题:
JObject(
(json \ "data").asInstanceOf[JObject].obj.groupBy(_.name).map {
case (_, v :: Nil) => v
case (k, vs) => JField(k, JArray(vs.map(_.value)))
}.toList
)
Run Code Online (Sandbox Code Playgroud)
但这里至少存在一些潜在的问题:
groupBy,所以我们最终可能会重新排列子元素的顺序.item,它将不会被包裹JArray.根据您的关心程度,您可以围绕这些问题编写方法,但几乎肯定不值得.只需忽略net.liftweb.json.Xml并从Scala数据结构生成XML和JSON.
| 归档时间: |
|
| 查看次数: |
459 次 |
| 最近记录: |