Scala:如何将带有混合标记的xml元素转换为JSON字符串?
我想转换下面的XML对象Scala:如何将带有混合标记的xml元素转换为JSON字符串?,json,xml,scala,Json,Xml,Scala,我想转换下面的XML对象 val xml = <body> <para>first</para> <para>second</para> <sometag>xyz</sometag> </body> 我在scala库下面尝试过 1。net.liftweb | lift-json | u 2.11 | 3.3.0 import net.liftweb._ import net
val xml = <body>
<para>first</para>
<para>second</para>
<sometag>xyz</sometag>
</body>
我在scala库下面尝试过
1。net.liftweb | lift-json | u 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)))
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”}
2。org.json4s | json4s-xml|u 2.11 | 3.6.5
import net.liftweb._
import net.liftweb.json.Xml.XmlNode
import net.liftweb.json.Xml
import net.liftweb.json._
println("JSON STRING" + compactRender(toJson(xml)))
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"}}
(有点晚了。)
您可以为此使用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"
}}
import org.json.XML
val xml=”“”
第一
第二
xyz
"""
val jsonStr=XML.toJSONObject(xmlData).toString(indentFactor=4)
println(jsonStr)
输出:
{“机构”:{
“第款”:[
“第一”,
“第二”
],
“sometag”:“xyz”
}}
注意:JSON元素的顺序可能会有所不同。可能是重复的,有大量不同的库用于将XML转换为JSON;他们做的都不一样,没有一个人每次都做对了。为了使转换“正确”,库必须知道两个para元素的顺序是重要的,但sometag子元素的相对顺序不是。它怎么可能知道呢?你想打印什么?@james whiteley firstsecondxyz应该打印到{“body”:{“para”:[{“inner”:“first}”,second“],“sometag”:“xyz”}顺便说一句,如果只有“para”,它实际上会解析到一个列表中标记,因此如果您没有
sometag
或在“para”中添加父项,则它可以工作。正如这里提到的,有很多方法可以解析这样的列表。。