当前位置: 首页 > 工具软件 > JSON4J > 使用案例 >

xml转json(dom4j + fastjson)

南宫浩皛
2023-12-01
public static void main(String[] args) {
    String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +
            "<customer>\n" +
            "    <id>100</id>\n" +
            "    <name>lanying</name>\n" +
            "    <age>29</age>\n" +
            "    <books>\n" +
            "        <book>\n" +
            "            <id>1</id>\n" +
            "            <name>三国演义</name>\n" +
            "            <price>100.0</price>\n" +
            "        </book>\n" +
            "        <book>\n" +
            "            <id>2</id>\n" +
            "            <name>红楼梦</name>\n" +
            "        </book>\n" +
            "        <book>\n" +
            "            <id>1</id>\n" +
            "            <price>100.0</price>\n" +
            "        </book>\n" +
            "        <book>\n" +
            "            <name>西游记</name>\n" +
            "            <price>50.0</price>\n" +
            "        </book>\n" +
            "    </books>\n" +
            "</customer>";

    String data = XmlToJsonUtil.xmlToJson(xml);
    JSONObject jsonObj = JSONObject.parseObject(data);
    System.out.println("jsonObj = " + jsonObj); 

    // 层层解析
    JSONObject customer = jsonObj.getJSONObject("customer");
    System.out.println("customer = " + customer);

    JSONObject books = customer.getJSONObject("books");
    System.out.println("books = " + books);

    JSONArray jsonArr = books.getJSONArray("book");
    System.out.println("book = " + jsonArr);

    for(int i = 0; i < jsonArr.size(); i ++){
        JSONObject book = jsonArr.getJSONObject(i);
        System.out.println(book.toJSONString());
    }
}
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.dom4j.*;

import java.util.List;

public class XmlToJsonUtil {
    /*
     * xml转json
     */
    public static String xmlToJson(String xml) {
        try {
            // xmlStr ==> Document
            Document doc = DocumentHelper.parseText(xml);

            // Document ==> jsonStr
            Element rootEle = doc.getRootElement();
            JSONObject json = new JSONObject();
            dom4j2Json(rootEle, json);

            // 为了让JSON中包含根元素的key,才创建了resultJSON对象
            JSONObject resultJSON = new JSONObject();
            resultJSON.put(rootEle.getName(), json);

            return resultJSON.toJSONString();
        } catch (DocumentException e) {
            System.out.println("数据解析失败");   // 可改为打印日志
        }
        return null;
    }


    /**
     * 将element里面的内容存入参数json中
     *
     * @param element
     * @param json
     */
    private static void dom4j2Json(Element element, JSONObject json) {
        // Step 1: 如果有属性 形如:<XXX attr="xxx">张三</XXX>
        for (Object o : element.attributes()) {
            Attribute attr = (Attribute) o;
            if (!isEmpty(attr.getValue())) {
                json.put("@" + attr.getName(), attr.getValue());        // key前加@存入参数json 形如:{"@attr":"value"},可自定义存入格式
            }
        }

        // 获取element的子一级元素
        List<Element> childElements = element.elements();

        // Step 2: 形如:<name>张三</name>
        if (childElements.isEmpty() && !isEmpty(element.getText())) {   // 如果没有子元素,只有一个值
            json.put(element.getName(), element.getText());
        }

        // Step 3: 子元素 e是element的子一级元素
        for (Element e : childElements) {                               // element有子元素
            if (e.elements().isEmpty()) {                               // 子元素e没有子元素(子子元素)
                // attr
                for (Object o : e.attributes()) {
                    Attribute attr = (Attribute) o;
                    if (!isEmpty(attr.getValue())) {
                        json.put("@" + attr.getName(), attr.getValue());
                    }
                }
                // <name>张三</name>
                if (!isEmpty(e.getText())) {
                    json.put(e.getName(), e.getText());
                }

            } else {                                                // 子元素也有子元素
                JSONObject childJson = new JSONObject();
                dom4j2Json(e, childJson);                           // 递归,将e中的数据存入childJson

                Object o = json.get(e.getName());                   // 通过这个子元素e的key从参数json中获取内容

                if (o == null) {    // 说明json中没有存入过该类型的子元素,则当前的childJson作为第一个元素存入参数json
                    if (!childJson.isEmpty()) {
                        json.put(e.getName(), childJson);
                    }
                } else {            // json中已经存入过该类型的子元素,说明不止一个,需要转成数组形式存入参数json
                    JSONArray jsonArr = null;
                    if (o instanceof JSONObject) {                  // 当前o是之前存入的子元素,即"第一个子元素"
                        JSONObject jsonObj = (JSONObject) o;
                        json.remove(e.getName());                   // 删除之前的JSONObject(稍候以JSONArray形式存入)
                        jsonArr = new JSONArray();                  // 新建JSONArray
                        jsonArr.add(jsonObj);                       // 添加"第一个子元素"
                        jsonArr.add(childJson);                     // 添加当前子元素

                    } else if (o instanceof JSONArray) {            // 如果已经存在JSONArray,则直接在该JSONArray中添加
                        jsonArr = (JSONArray) o;
                        jsonArr.add(childJson);                     // 添加当前子元素
                    }

                    json.put(e.getName(), jsonArr);                 // {e:[{child1},{child2},{child3}]}
                }
            }
        }
    }

    public static boolean isEmpty(String str) {
        if (str == null || str.trim().isEmpty() || "null".equals(str)) {
            return true;
        }
        return false;
    }

}

Maven依赖

dom4j 和 fastjson

<!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
<dependency>
    <groupId>org.dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>2.1.1</version>
</dependency>

<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.72</version>
</dependency>

结果

jsonObj的内容:

{
  "customer": {
    "books": {
      "book": [
        {
          "price": "100.0",
          "name": "三国演义",
          "id": "1"
        },
        {
          "name": "红楼梦",
          "id": "2"
        },
        {
          "price": "100.0",
          "id": "1"
        },
        {
          "price": "50.0",
          "name": "西游记"
        }
      ]
    },
    "name": "lanying",
    "id": "100",
    "age": "29"
  }
}

学习网址

【xml转换成json】https://www.cnblogs.com/liushisaonian/p/8657555.html
【Dom4j中getStringValue()和getText()用法和区别】https://blog.csdn.net/www_wangjun/article/details/71404204
【fastjson中toString与toJSONString的差别】https://www.cnblogs.com/zouhong/p/12091493.html
【xml <=> json在线转换工具】https://www.bejson.com/xml2json/
【JSONobject按照put顺序存储和读取】https://blog.csdn.net/dushu990/article/details/80670088

 类似资料: