XML转换为JSON带电梯的行为怪异(converting xml to Json with lif

2019-09-21 08:06发布

我使用斯卡拉/升降机的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))
                ))
            )
        )
    ))
)

阵列没有定义和我有名称为“项目”的两个对象。 这是一种正常的行为? 我想有数组不成才包裹的aroung“项”标签。

Answer 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并同时生成您的XML和Scala的数据结构中的JSON。



文章来源: converting xml to Json with lift behaves strange