我有这个json字符串: -
{
"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)
如果你想使用像JSONObject和XML这样的org.json类,那么请注意JSON和XML之间没有自然映射。而不是使用XML类,尝试来自同一个库的JSONML类,就是它的用途。请注意如何修改JSON文本以便JSONML可以解析。你可以在这个页面找到BNF for 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>
您可以使用(更改“@”的属性标记而不是“ - ”。(这是一个groovy脚本,但它与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>
如果这对你有效,那么我们将不得不等待某人给我们另一种解决方案。