【问题标题】:converting xml to Json with lift behaves strange使用提升将 xml 转换为 Json 行为很奇怪
【发布时间】:2012-08-14 17:15:36
【问题描述】:

我正在使用 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”的对象。这是正常行为吗?我希望数组不围绕“项目”标签包装。

【问题讨论】:

    标签: xml json scala xml-serialization lift


    【解决方案1】:

    是的,这是预期的行为: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。

    【讨论】:

    • 你会怎么做?创建一个包含字段的案例类,然后对其进行序列化?
    • 是的,这将使您能够更好地控制两种序列化格式的表示。
    • 请给我一个generate both your XML and your JSON from a Scala data structure.的例子
    猜你喜欢
    • 2019-12-10
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 2015-03-22
    • 1970-01-01
    相关资源
    最近更新 更多