Atitit xml轉json總結 目錄 1.1. XML和JSON之間沒有直接對映;元素型別問題 1 1.2. Xml與json的對應關係 2 1.3. 範例 2 2. Jsonlib的問題,,不

attilax發表於2020-10-02

Atitit xml轉json總結

 

目錄

1.1. XML和JSON之間沒有直接對映;元素型別問題 1

1.2. Xml與json的對應關係 2

1.3. 範例 2

2. Jsonlib的問題,,不支援type屬性 2

3. org.json也可以 推薦 2

4. Other 3

4.1. 通過轉換map中轉也麻煩,因為要建立bean,或者特定格式的 3

4.2. 測試一下可以轉換簡單的不能轉複雜的,巢狀的xml 5

 

 

    1. XML和JSON之間沒有直接對映;元素型別問題

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物件。

 

    1. Xml與json的對應關係

 

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來實現。。

 

 

    1. 範例

 

<message from="romUser@xxx.com">

<body>bodytxt</body>

</message>

{"@from":"romUser@xxx.com","body":"bodytxt"}

 

  1. Jsonlib的問題,,不支援type屬性

丟失root跟標籤xml標籤

  1.  org.json也可以 推薦

支援type屬性比較完美,支援root總標籤,不丟失標籤

 

{"message":{"from":"romUser@xxx.com","to":"toUser@longbourn.lit/study","type":"groupchat","body":"bodytxt"}}

  1. Other
    1. 通過轉換map中轉也麻煩,因為要建立bean,或者特定格式的

 

 

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方式,希望各位大神能告訴一下,再次先謝過了,那麼這篇到此結束先了

 

    1. 測試一下可以轉換簡單的不能轉複雜的,巢狀的xml

 

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

相關文章