xml和json互转工具类

分享一个json与xml互转的工具类,非常好用

一、maven依赖

json 和 xm 互转
        
            org.dom4j
            dom4j
            2.1.3
        
        
            com.alibaba
            fastjson
            1.2.83
        
        
            com.google.code.gson
            gson
        

二、工具类代码

package com.test.main;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import java.util.List;
import java.util.Map;
import java.util.Set;

public class JsonXmlUtils {

    public  static JSONObject toJson(String xml){
        JSONObject jsonObject = new JSONObject();
        Document document = null;
        try {
            document = DocumentHelper.parseText(xml);
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        //获取根节点元素对象
        Element root = document.getRootElement();
        return xmlToJson(root,jsonObject);
    }

    public static JSONObject  xmlToJson(Element node,JSONObject json){
        //获取子节点list
        List list = node.elements();
        //获取节点名字
        String name = node.getName();
        //最下面的一层
        if(list.isEmpty()){
            String nodeValue = node.getTextTrim();
            json.put(name, nodeValue);
        }else{
            //下级节点进行嵌套
            JSONObject js = new JSONObject();
            //判断json数据中是否存在相同的 key
            //存在相同的key需要使用数组存储
            if(json.containsKey(name)){
                JSONArray jsonArray = null;
                Object o = json.get(name);
                if(o instanceof JSONArray){
                    jsonArray=(JSONArray) o;
                }else{
                    jsonArray = new JSONArray();
                    jsonArray.add(o);
                }
                json.put(name,jsonArray);
                jsonArray.add(js);
            }else {
                json.put(name,js);
            }
            //递归
            for (Element element : list) {
                xmlToJson(element,js);
            }

        }
        return json;
    }

    /**
     * 将json字符串转换成xml
     *
     * @param json
     *            json字符串
     * @throws Exception
     */
    public static Element toXml(String json,Element root) {
        JsonObject jsonObject = new JsonParser().parse(json).getAsJsonObject();
        Element ee = jsonToXml(jsonObject, root, null);
        return ee.elements().get(0);
    }

    /**
     * 将json字符串转换成xml
     *
     * @param jsonElement
     *            待解析json对象元素
     * @param parentElement
     *            上一层xml的dom对象
     * @param name
     *            父节点
     */
    public static Element jsonToXml(JsonElement jsonElement, Element parentElement, String name) {
        if (jsonElement instanceof JsonArray) {
            //是json数据,需继续解析
            JsonArray sonJsonArray = (JsonArray)jsonElement;
            for (int i = 0; i < sonJsonArray.size(); i++) {
                JsonElement arrayElement = sonJsonArray.get(i);
                jsonToXml(arrayElement, parentElement, name);
            }
        }else if (jsonElement instanceof JsonObject) {
            //说明是一个json对象字符串,需要继续解析
            JsonObject sonJsonObject = (JsonObject) jsonElement;
            Element currentElement = null;
            if (name != null) {
                currentElement = parentElement.addElement(name);
            }
            Set> set = sonJsonObject.entrySet();
            for (Map.Entry s : set) {
                jsonToXml(s.getValue(), currentElement != null ? currentElement : parentElement, s.getKey());
            }
        } else {
            //说明是一个键值对的key,可以作为节点插入了
            Element el = parentElement.addElement(name);
            el.addText(jsonElement.getAsString());
        }
        return parentElement;
    }

}

三、实体类

这里为了更全面的演示,所以嵌套三层

第三层:

public class PeopleBase {
    private People people;

    public PeopleBase(People people) {
        this.people = people;
    }
}

第二层:

@Data
public class People {
    private String name;
    private Integer age;
    private List likes;
}

第三层:

@Data
public class PeopleOther {
    private String like;
}

四、使用方式

json转xml 

public static void main(String[] args) throws Exception {
        People people = new People();
        people.setName("张三");
        people.setAge(1);
        PeopleOther peopleOther1 = new PeopleOther();
        peopleOther1.setLike("冰淇淋");
        PeopleOther peopleOther2 = new PeopleOther();
        peopleOther2.setLike("巧克力");
        List likes = new ArrayList<>();
        likes.add(peopleOther1);
        likes.add(peopleOther2);
        people.setLikes(likes);

        // 将json转为xml
        Element root = new BaseElement("root");
        System.out.println(JsonXmlUtils.toXml(new Gson().toJson(new PeopleBase(people)), root).asXML());
    }

xml转json:

public static void main(String[] args) throws Exception {
        String xmlStr = "张三1冰淇淋巧克力";
        System.out.println(JsonXmlUtils.toJson(xmlStr));
    }

你可能感兴趣的:(java,spring,java,json,xml)