Atitit xml轉json總結 目錄 1.1. XML和JSON之間沒有直接對映;元素型別問題 1 1.2. Xml與json的對應關係 2 1.3. 範例 2 2. Jsonlib的問題,,不
Atitit xml轉json總結
目錄
1.1. XML和JSON之間沒有直接對映;元素型別問題 1
4.1. 通過轉換map中轉也麻煩,因為要建立bean,或者特定格式的 3
4.2. 測試一下可以轉換簡單的不能轉複雜的,巢狀的xml 5
Fastjson冒失是潛入一個@type指明型別
XML帶有型別資訊(每個元素都有一個名稱)以及名稱空間。因此,除非每個JSON物件都嵌入了型別資訊,否則轉換將是有損的。
但這並不一定要緊。重要的是JSON的使用者知道資料協定。例如,給定以下XML:
<books>
<book author="Jimbo Jones" title="Bar Baz">
<summary>Foo</summary>
</book>
<book title="Don't Care" author="Fake Person">
<summary>Dummy Data</summary>
</book></books>
您可以將其轉換為:
{
"books": [
{ "author": "Jimbo Jones", "title": "Bar Baz", "summary": "Foo" },
{ "author": "Fake Person", "title": "Don't Care", "summary": "Dummy Data" },
]
}
消費者不需要知道books集合中的每個物件都是一個book物件。
String xml = "<hello><test to='toUser@longbourn.lit/study' >1.2</test><test2>123</test2></hello>";
{"test":{"@to":"toUser@longbourn.lit/study","#text":"1.2"},"test2":"123"}
Xml元素通過json子物件模式實現,,xml屬性通過 sjon屬性@prop實現,其實我覺得直接抓換為json屬性也可呀。。Xml標籤內容,通過json屬性#text來實現。。
<message from="romUser@xxx.com">
<body>bodytxt</body>
</message>
{"@from":"romUser@xxx.com","body":"bodytxt"}
丟失root跟標籤xml標籤
- org.json也可以 推薦
支援type屬性比較完美,支援root總標籤,不丟失標籤
{"message":{"from":"romUser@xxx.com","to":"toUser@longbourn.lit/study","type":"groupchat","body":"bodytxt"}}
2. xml字串 轉JSON
xml轉JON 需要藉助 jackSon的 fastxml包來實現
<!-- fasterxml -->
<dependency>
<groupId>com.fasterxml</groupId>
<artifactId>jackson-xml-databind</artifactId>
<version>0.6.2</version>
</dependency>
/**
* xml 轉json
*/
public static JSONObject convertXmlToJson(String xml) throws IOException {
XmlMapper xmlMapper = new XmlMapper();
JSONObject param = xmlMapper.readValue(xml, JSONObject.class);
return param;
}
利用XmlMapper這個類, 簡單兩段程式碼就可以搞定 但是該方法有個缺點, 如果你的xml字串轉換的內容裡 有陣列的情況下, 直接這樣轉是不行的。 這種情況就要自己建立相應的實體類來做接收。 注:實體要有相應的getset方法, 並要保證和xml中的欄位名一一對應。
另外一種方式是使用org.json來實現,這種方式更簡單,只需要兩個jar包即可,下載地址http://mvnrepository.com/artifact/org.json/json,隨便下載一個使用比較多的jar包版本即可,具體實現程式碼見下
public class JsonUtils {
public static String xml2jsonString() throws JSONException, IOException {
InputStream in = JsonUtils.class.getResourceAsStream("student.xml");
String xml = IOUtils.toString(in);
JSONObject xmlJSONObj = XML.toJSONObject(xml);
return xmlJSONObj.toString();
}
public static void main(String[] args) throws JSONException, IOException {
String string = xml2jsonString();
System.out.println(string);
}
}
簡單對比一下使用json-lib的實現方式,前面的程式碼基本一致,區別是這裡使用的是org.json.XML類,呼叫的是toJSONObject方法,接受的是一個xml格式的字串,生成一個JSONObject物件,這裡也是一樣,調不呼叫jsonobject的toString方法輸出效果都一樣,xml檔案內容一樣,輸出的格式見下
{"student":{"sex":"man","name":"zhangsan"}}
最後總結一下:
1 json-lib依賴的jar包很多,需要全部集齊,org.json僅僅需要兩個jar包即可實現,一個org.json另一個是commons-io
2 兩者輸出的xml格式不同,前者不帶根標籤需要手動新增,會區別標籤的屬性和子標籤,後者帶有根標籤,標籤的屬性和子標籤不會區分對待,因此根據自己的實際情況自行選擇修改即可。
PS:如果還有其他的更好的xml轉json方式,希望各位大神能告訴一下,再次先謝過了,那麼這篇到此結束先了
Atitit.xml轉換map 通用物件的實現
public class XMLParser
public static Map<String,Object> getMapFromXML(String xmlString) throws ParserConfigurationException, IOException, SAXException {
//這裡用Dom的方式解析回包的最主要目的是防止API新增回包欄位
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
InputStream is = Util.getStringStream(xmlString);
Document document = builder.parse(is);
//獲取到document裡面的全部結點
NodeList allNodes = document.getFirstChild().getChildNodes();
Node node;
Map<String, Object> map = new HashMap<String, Object>();
int i=0;
while (i < allNodes.getLength()) {
node = allNodes.item(i);
if(node instanceof Element){
map.put(node.getNodeName(),node.getTextContent());
}
i++;
}
return map;
}
還有個。。wechatx4pay 。。。
思路,先轉換為潛逃的map。。但是貌似只能手工轉,這些框架都不能像自動轉換
Exception in thread "main" net.sf.json.JSONException: java.lang.NullPointerException: Cannot invoke "String.compareToIgnoreCase(String)" because "type" is null
at net.sf.json.xml.XMLSerializer.read(XMLSerializer.java:331)
at hsimprjMavenAid.Xml2Json.xmppmsg(Xml2Json.java:32)
at hsimprjMavenAid.Xml2Json.main(Xml2Json.java:16)
Caused by: java.lang.NullPointerException: Cannot invoke "String.compareToIgnoreCase(String)" because "type" is null
at net.sf.json.xml.XMLSerializer.setValue(XMLSerializer.java:1236)
at net.sf.json.xml.XMLSerializer.processObjectElement(XMLSerializer.java:1095)
at net.sf.json.xml.XMLSerializer.read(XMLSerializer.java:322)
... 2 more
原因是因為是有個type屬性,可能關鍵詞重名了。。。
在Java中將XML轉換為JSON的最快方法 - Thinbug
相關文章
- json與xml的區別JSONXML
- XML 與 JSON 優劣對比XMLJSON
- XML與JSONXMLJSON
- 2章的目錄配置,修改server.xml的問題?ServerXML
- XML和JSON的介紹XMLJSON
- XML與JSON(在更)XMLJSON
- XML+JSON面試題都在這裡XMLJSON面試題
- JSON 與XML相比優點JSONXML
- 再談JSON/XMLJSONXML
- XML入門常見問題(2)(轉)XML
- SQLServer中XML與JSON應用比較SQLServerXMLJSON
- 就Tim Bray對JSON和XML的比較的幾點看法JSONXML
- WebApi介面 - 響應輸出xml和jsonWebAPIXMLJSON
- XML轉化為json工具類XMLJSON
- xStream完美轉換XML、JSONXMLJSON
- XML與JSON學習歸納XMLJSON
- JSON和XML:不可同日而語JSONXML
- Hibernate 對映xml中的屬性型別XML型別
- 自己實現JSON、XML的解析 沒那麼難JSONXML
- 資料格式之戰:JSON vs XMLJSONXML
- 問題:JSON的格式型別到底有哪些呢?JSON型別
- iOS JSON與Object之間的對映 ObjectMapper For SwiftiOSJSONObjectAPPSwift
- 關於James Clark的XML, JSON和其它許多事情XMLJSON
- 還在比較 JSON 和 XML?Stop!JSONXML
- YAML & JSON &XML如何選擇YAMLJSONXML
- JSON相比XML優劣勢JSONXML
- 關於XML字串和XML Document之間的轉換薦XML字串
- 陣列轉json後的資料型別問題陣列JSON資料型別
- Java XML和JSON:Java SE的文件處理 第2部分JavaXMLJSON
- 解析XML和JSON內容的一點技巧XMLJSON
- 關於“Struts with XSLT and XML ”的Model2X的問題XML
- XML入門常見問題(1)(轉)XML
- .NETCore C# 中級篇2-6 Json與XMLNetCoreC#JSONXML
- struts json型別返回結果異常問題JSON型別
- WebSphere Integration Developer V7 中的 XML 對映,第 2 部分: 處理複雜的 XML 結構WebDeveloperXML
- xml處理的問題XML
- build.xml的問題UIXML
- 針對XML資料的關係型檢視XYXML