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
相關文章
- XML 與 JSON 優劣對比XMLJSON
- XML與JSONXMLJSON
- XML與JSON有什麼的區別?XMLJSON
- xml字串轉JSON字串XML字串JSON
- XML和JSON的介紹XMLJSON
- XML與JSON(在更)XMLJSON
- JSON 與XML相比優點JSONXML
- XML轉化為json工具類XMLJSON
- XML與JSON學習歸納XMLJSON
- .NETCore C# 中級篇2-6 Json與XMLNetCoreC#JSONXML
- YAML & JSON &XML如何選擇YAMLJSONXML
- Python將xml格式轉換為json格式PythonXMLJSON
- Java XML和JSON:Java SE的文件處理 第2部分JavaXMLJSON
- 陣列轉json後的資料型別問題陣列JSON資料型別
- 2024.10.5 xml,yaml,json區別,機器人模擬,codeforces刷題XMLYAMLJSON機器人
- 問題:JSON的格式型別到底有哪些呢?JSON型別
- Protobuf 為啥比 JSON、XML 牛?JSONXML
- Jackson JSON包在從物件對映到Json字串過程的迴圈依賴問題-分析與解決JSON物件字串
- 針對XML資料的關係型檢視XYXML
- 關於 Spartacus 的 sitemap.xml 問題XML
- JSON、XML、TOML、CSON、YAML 大比拼JSONXMLTOMLYAML
- 建立Dynamic Web Project沒有web.xml問題WebProjectXML
- fastjson字串轉JSON的$ref問題ASTJSON字串
- Java XML和JSON:Java SE的文件處理,第1部分JavaXMLJSON
- Mybatis 基礎xml對映MyBatisXML
- 目錄樹轉 JSONJSON
- mysql之json型別與文字儲存json的優勢MySqlJSON型別
- Java面試題總結之OOA/D,UML,和XMLJava面試題XML
- java高階用法之:JNA型別對映應該注意的問題Java型別
- 關於 Android studio 在xml中不提示的問題AndroidXML
- Newtonsoft.Json序列化JSON字串問題JSON字串
- 求大佬幫助我!!!IDEA中Mybatis的mapper.xml和dao.xml出現問題!!!IdeaMyBatisAPPXML
- JSON 與 JS 物件的關係JSON物件
- 實現JSON線上美化(格式化)、JSON轉CSV、CSV轉XML工具-toolfk程式設計師工具網JSONXML程式設計師
- 從json-lib轉成jackson的遇到的問題JSON
- JSON 與 Java 物件之間的轉化JSONJava物件
- golang json處理問題GolangJSON
- 關於IDEA使用xml實現動態sql的問題IdeaXMLSQL