首页 > 解决方案 > Scala:如何将带有混合标签的 xml Elem 转换为 JSON 字符串?

问题描述

我想转换下面的 XML 对象,

val xml = <body>
    <para>first</para>
    <para>second</para>
    <sometag>xyz</sometag>
</body>

转 JSON

{"body":{"para":["first","second"],"sometag":"xyz"}}

我试过下面的 scala 库,

1. net.liftweb | 提升-json_2.11 | 3.3.0

import net.liftweb._

import net.liftweb.json.Xml.XmlNode

import net.liftweb.json.Xml

import net.liftweb.json._


println("JSON STRING" + compactRender(toJson(xml)))

输出:{"body":{"para":"first","para":"second","sometag":"xyz"}}

2. org.json4s | json4s-xml_2.11 | 3.6.5

import org.json4s.Xml.{ toJson, toXml }

import org.json4s._

import org.json4s.JsonDSL._

import org.json4s.native.JsonMethods.{ render, pretty, compact }


println("JSON String:" + compact(render(toJSON(xml))))

输出:{"body":{"para":"first","para":"second","sometag":"xyz"}}

在这两种情况下,我都会看到重复的键(注意 para 出现了两次),这在 JSON 中是无效的。相反,我的期望是,如果在 XML 文档中看到重复的 XML 标记,转换器必须将这些值放入数组中,如下所示

{"body":{"para":["first","second"],"sometag":"xyz"}}

标签: jsonxmlscala

解决方案


(有点晚了。)您可以为此使用org.json Java 库。

import org.json.XML

val xml = """<body>
    <para>first</para>
    <para>second</para>
    <sometag>xyz</sometag>
</body>"""

val jsonStr = XML.toJSONObject(xmlData).toString( indentFactor=4 )

println(jsonStr)

Output:

{"body": {

    "para": [
        "first",
        "second"
    ],
    "sometag": "xyz"
}}

注意:JSON 元素的顺序可能会有所不同。


推荐阅读