gpt4 book ai didi

xml - 使用 lift 将 xml 转换为 Json 的行为很奇怪

转载 作者:数据小太阳 更新时间:2023-10-29 02:05:18 26 4
gpt4 key购买 nike

我将 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>

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))
)
)
)
)
)
)
)
)
)
)

但是如果我添加一个新的 xml 元素:

<data>
<baz>234</baz>
<item>
<foo>1</foo>
<bar>1</bar>
</item>
<item>
<foo>2</foo>
<bar>2</bar>
</item>
</data>

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))
))
)
)
))
)

)

数组未定义,我有两个名为“item”的对象。这是正常行为吗?我想要数组而不在“项目”标签周围包装一些东西。

最佳答案

是的,这是预期的行为:net.liftweb.json.Xml 只会将同名的子元素分组到一个 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
)

但是这里至少有几个潜在的问题:

  1. 我们正在使用 groupBy,因此我们最终可能会重新排列子元素。
  2. 如果只有一个 item,它不会被包装在 JArray 中。

根据您的关心程度,您可以写出解决这些问题的方法,但这几乎肯定不值得。只需忽略 net.liftweb.json.Xml 并从 Scala 数据结构生成 XML 和 JSON。

关于xml - 使用 lift 将 xml 转换为 Json 的行为很奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12019633/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com