Java進級のXML回転JSON

5552 ワード

インタフェーステストでも開発でも、インタフェースから戻ってきたデータがXMLタイプであることに遭遇することがあります.この場合、XML転送Java Beanを単独で書きたくありません.なぜなら、XMLが戻り結果として相対的にJSONほど主流ではなく、JSONフィールドで設計されたBeanオブジェクト属性がXMLに一致するとは限らないため、XMLをJSONに変換した後、解析JSONを押して処理しました.この間、ちょうどこのような需要に出会って、実現方法をみんなに分かち合いました.
依存関係
maven管理依存に基づいてpomファイルに次のdependencyを加え、JSON用アリのfastjsonを解析し、xml用jdomを解析する必要がある.

        com.alibaba
        fastjson
        1.2.32
 
 
        org.jdom
        jdom
        2.0.2
 

へんかんろんり
XML 2 JSONツールクラスがカプセル化されています.
import org.apache.commons.lang.StringUtils;
import org.jdom2.Document;
import org.jdom2.JDOMException;
import com.alibaba.fastjson.JSONObject;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.LinkedList;
import java.util.List;

/**
 * Created by alany on 2018/7/10.
 */
public class XmlUtils {
    public static JSONObject xml2Json(String xmlStr) throws JDOMException, IOException {
        if (StringUtils.isEmpty(xmlStr)) {
            return null;
        }
        xmlStr = xmlStr.replaceAll("\\
", ""); byte[] xml = xmlStr.getBytes("UTF-8"); JSONObject json = new JSONObject(); InputStream is = new ByteArrayInputStream(xml); SAXBuilder sb = new SAXBuilder(); 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(); JSONObject obj = new JSONObject(); List list = null; for (Element child : node) { list = new LinkedList(); String text = child.getTextTrim(); if (StringUtils.isBlank(text)) { if (child.getChildren().size() == 0) { continue; } if (obj.containsKey(child.getName())) { list = (List) obj.get(child.getName()); } list.add(iterateElement(child)); // child obj.put(child.getName(), list); } else { if (obj.containsKey(child.getName())) { Object value = obj.get(child.getName()); try { list = (List) value; } catch (ClassCastException e) { list.add(value); } } if (child.getChildren().size() == 0) { //child text obj.put(child.getName(), text); } else { list.add(text); obj.put(child.getName(), list); } } } return obj; } }

テストを走って変換効果を見ます.
@Test
public void test() throws JDOMException, IOException {
    String xml = "
" + "
" + "
" + "  
" + "  
" + "  

" + "
" + "  
" + "  
" + "  

" + "
" + "
" + "  
" + "  
" + "  

" + "
" + "  
" + "  
" + "  

" + "

" + "

"; JSONObject json = xml2Json(xml); System.out.println(json.toJSONString()); }

直接生産を完走したJSON:
{
    "sitemapindex":{
        "sitemaps":[
            {
                "sitemap":[
                    {
                        "loc":"[http://qq.com/xml/_46.xml](http://qq.com/xml/_46.xml)",
                        "lastmod":"2018-06-20 01:28:09"
                    },
                    {
                        "loc":"[http://qq.com/xml/_47.xml](http://qq.com/xml/_47.xml)",
                        "lastmod":"2018-06-25 01:28:09"
                    }
                ]
            }
        ],
        "sitemap":[
            {
                "loc":"[http://qq.com/xml/_1.xml](http://qq.com/xml/_1.xml)",
                "lastmod":"2018-06-20 01:28:09"
            },
            {
                "loc":"[http://qq.com/xml/_2.xml](http://qq.com/xml/_2.xml)",
                "lastmod":"2018-06-20 01:28:09"
            }
        ]
    }
}

PS:XML形式は標準(ラベルはペアで表示)でなければ解析できない可能性があり、複雑なHTMLページをテストすると変換に失敗します.
原文は下の公衆番号から来て、転載は作者に連絡して、そして必ず出典を保留してください.最初の時間にもっとオリジナルの技術の良い文と資料を見たいなら、公衆番号に注目してください:テスト開発スタック