如何将JSON字符串转换为具有属性的xml?
问题描述:
我有这样的JSON字符串: -如何将JSON字符串转换为具有属性的xml?
{
"mkt": {
"-st": "NSW",
"-pc": "2150",
"-lo": "PARRAMATTA",
"-pt": "U",
"-notify_by": "email",
"-notify_when": "any",
"stat": [
{
"-code": "DSR_PLUS",
"-change": "falls below",
"-val": "50"
},
{
"-code": "TV",
"-change": "rises above",
"-val": "450000"
}
]
}
}
我打算将它转换为XML这样的: -
<?xml version="1.0" encoding="UTF-8" ?>
<mkt st="NSW" pc="2150" lo="PARRAMATTA" pt="U" notify_by="email" notify_when="any">
<stat code="DSR_PLUS" change="falls below" val="50" />
<stat code="TV" change="rises above" val="450000" />
</mkt>
我使用此代码JSON字符串转换为XML: -
JSONObject o = new JSONObject(JSONSTring);
String xml = org.json.XML.toString(o);
但这是给我错XMl(XML没有属性)
答
如果您想使用org.json类(如JSONObject和XML),请注意JSON和XML之间没有自然映射。不要使用XML类,而是尝试来自同一个库的JSONML类,这就是它的用途。请注意,您必须修改JSON文本才能被JSONML解析。你可以找到的BNF JSONML此页上:http://jsonml.org
String jsonXmlStr =
"{"+
"\"st\": \"NSW\","+
"\"notify_by\": \"email\","+
"\"notify_when\": \"any\","+
"\"pc\": 2150,"+
"\"lo\": \"PARRAMATTA\","+
"\"pt\": \"U\","+
"\"childNodes\": ["+
"{"+
"\"val\": 50,"+
"\"code\": \"DSR_PLUS\","+
"\"change\": \"falls below\","+
"\"tagName\": \"stat\""+
"},"+
"{"+
"\"val\": 450000,"+
"\"code\": \"TV\","+
"\"change\": \"rises above\","+
"\"tagName\": \"stat\""+
"}"+
"],"+
"\"tagName\": \"mkt\""+
"}";
JSONObject jsonXmlObject = new JSONObject(jsonXmlStr);
System.out.println(JSONML.toString(jsonXmlObject));
以上JSON文本和代码片段将生成所需的XML:
<mkt st="NSW" notify_by="email" notify_when="any" pc="2150" lo="PARRAMATTA" pt="U">
<stat val="50" code="DSR_PLUS" change="falls below"/>
<stat val="450000" code="TV" change="rises above"/>
</mkt>
答
你可以我们e(将属性标签更改为“@”而不是“ - ”。 (这是一个时髦的脚本,但它几乎与Java相同)
import net.sf.json.JSON
import net.sf.json.JSONSerializer
import net.sf.json.xml.XMLSerializer
JSON json = JSONSerializer.toJSON(jsonString)
XMLSerializer xmlSerializer = new XMLSerializer()
xmlSerializer.setTypeHintsCompatibility(false)
def xml = xmlSerializer.write(json)
小心!你可能有问题与你的JSON如果它有复杂的数组,事实上..这就是我正在寻找一种方法来将JSON转换为具有属性的XML。
<mkt lo="PARRAMATTA" notify_by="email" notify_when="any" pc="2150" pt="U" st="NSW">
<stat>
<e change="falls below" code="DSR_PLUS" val="50"/>
<e change="rises above" code="TV" val="450000"/>
</stat>
</mkt>
如果这对你有用,那么完美否则..我们将不得不等待有人给我们另一种解决方案。