zoukankan      html  css  js  c++  java
  • java xml转为json的两种方法

    java xml转为json的两种方法

    <?xml version="1.0" encoding="utf-8" ?><auibinsurancecallback><policyinfo><transtype>TKTS</transtype><eticketno>xxx</eticketno><flightnumber>xxx</flightnumber><flightdate>2019-10-16</flightdate><operatetime>2019-10-16 17:20:00</operatetime><insureno>1910161720056066735</insureno><agreeno>102160199</agreeno><policyno></policyno><policyurl><!--[CDATA[]]--></policyurl></policyinfo><returninfo><serialnumber>2019103015284949545354</serialnumber><retruncode>0</retruncode><errormessage><!--[CDATA[xxx]]--></errormessage></returninfo></auibinsurancecallback>";
    

      

    先来看效果,效果一:

    {
      "auibinsurancecallback": {
        "returninfo": [
          {
            "retruncode": [
              "0"
            ],
            "serialnumber": [
              "2019103015284949545354"
            ]
          }
        ],
        "policyinfo": [
          {
            "operatetime": [
              "2019-10-16 17:20:00"
            ],
            "transtype": [
              "TKTS"
            ],
            "flightdate": [
              "2019-10-16"
            ],
            "insureno": [
              "1910161720056066735"
            ],
            "flightnumber": [
              "xxx"
            ],
            "agreeno": [
              "102160199"
            ],
            "eticketno": [
              "xxxx"
            ]
          }
        ]
      }
    }
    

      

    效果二:

    {
      "auibinsurancecallback": {
        "returninfo": {
          "errormessage": "",
          "retruncode": 0,
          "serialnumber": 2.0191030152849496e+21
        },
        "policyinfo": {
          "policyurl": "",
          "operatetime": "2019-10-16 17:20:00",
          "transtype": "TKTS",
          "flightdate": "2019-10-16",
          "insureno": 1910161720056066800,
          "flightnumber": "xxx",
          "agreeno": 102160199,
          "policyno": "",
          "eticketno": xxx
        }
      }
    }
    

      

    从效果来看,明显是第二种方法,比第一种好。

    下面把代码贴出出来

    第一种实现:用到的包是fastjson, jdom2

    public static JSONObject xml2JSON(byte[] xml) throws JDOMException, IOException {
            JSONObject json = new JSONObject();
            InputStream is = new ByteArrayInputStream(xml);
            SAXBuilder sb = new SAXBuilder();
            org.jdom2.Document doc = sb.build(is);
            Element root = doc.getRootElement();
            json.put(root.getName(), iterateElement(root));
            return json;
        }
    
        private static JSONObject iterateElement(Element element) {
            List node = element.getChildren();
            Element et = null;
            JSONObject obj = new JSONObject();
            List list = null;
            for (int i = 0; i < node.size(); i++) {
                list = new LinkedList();
                et = (Element) node.get(i);
                if (et.getTextTrim().equals("")) {
                    if (et.getChildren().size() == 0)
                        continue;
                    if (obj.containsKey(et.getName())) {
                        list = (List) obj.get(et.getName());
                    }
                    list.add(iterateElement(et));
                    obj.put(et.getName(), list);
                } else {
                    if (obj.containsKey(et.getName())) {
                        list = (List) obj.get(et.getName());
                    }
                    list.add(et.getTextTrim());
                    obj.put(et.getName(), list);
                }
            }
            return obj;
        }
    
     @Test
        public void xml1(){
            String  xml = 上面贴的xml;
    
            JSONObject json= null;
            try {
                json = xml2JSON(xml.getBytes());
                System.out.println(json.toJSONString());
            } catch (JDOMException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
    
    
        }
    

      

    第二种实现:用的org.json包,

    在用org.json包的时候,需要把spring-boot-starter-test中的,android-json排除,要不然会报错:

    java.lang.NoSuchMethodError: org.json.JSONTokener.<init>(Ljava/io/Reader;)V

    java.lang.NoSuchMethodError: org.json.JSONObject.put(Ljava/lang/String;Ljava/util/Collection;)

    <dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-test</artifactId>
    			<scope>test</scope>
    			<exclusions>
    				<exclusion>
    					<groupId>com.vaadin.external.google</groupId>
    					<artifactId>android-json</artifactId>
    				</exclusion>
    			</exclusions>
    		</dependency>
    

      

    实现方法简单:

     org.json.JSONObject xmlJSONObj = null;
            try {
                xmlJSONObj = XML.toJSONObject(xml);
                log.debug("json:" + xmlJSONObj.toString() );
            } catch (JSONException e) {
                e.printStackTrace();
            }
    

      

  • 相关阅读:
    《梦断代码》读后感(二)
    《梦断代码》读后感(一)
    最大子数组和(环状数组)
    求最大字数组的和的1000个元素的新要求
    面试题fugui02
    Linux基本操作
    面试题fugui
    水星的水
    python魔术方法
    tornado websocket聊天室
  • 原文地址:https://www.cnblogs.com/achengmu/p/15190645.html
Copyright © 2011-2022 走看看