阿里巴巴fastjson工具类,xml与json互转

12,129次阅读
没有评论

共计 4225 个字符,预计需要花费 11 分钟才能阅读完成。

注意:此工具用的是 fastjson 和 xml 转换,如果是其他的 json 工具如 hutool 的 json 或者 Gson 或者 jackjson,自行替换修改


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.parser.Feature;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;

/**
 * fastjson 工具类 (需要引入 fastjson 和 dom4j 的 pom 依赖)
 * @author hulei
 * @Date 2023/3/15 17:18
 */
public class FastJsonUtil {

    /**
     * xml 转 fastjson
     * @param xml 待转换数据 xml 字符串
     * @return JSONObject 对象
     */
    public static JSONObject xmlToFastJson(String xml){
        JSONObject jsonObject = null;
        try {jsonObject = new JSONObject();
            Document document = DocumentHelper.parseText(xml);
            // 获取根节点元素对象
            Element root = document.getRootElement();
            iterateNodes(root, jsonObject);
        }catch (Exception e){return jsonObject;}
        return jsonObject;
    }

    /**
     * fastjson 转 xml
     * @param jsonStr 待转换 json 字符串
     * @param escape  是否忽略特殊字符 (即特殊字符转 xml 后追加 CDATA)
     * @return
     */
    public static String fastJsonToXml(String jsonStr,Boolean escape) {
        try {StringBuffer buffer = new StringBuffer();
            // 带顺序
            JSONObject json = JSONObject.parseObject(jsonStr, Feature.OrderedField);
            jsonToXmlStr(json,buffer, escape != null && escape);
            return buffer.toString();} catch (Exception e) {e.printStackTrace();
            return "";
        }
    }

    /**
     * object 转 JSONObject
     * @param t
     * @param 
     * @return
     */
    public static  JSONObject objectToJSONObject(T  t){return  JSONObject.parseObject(JSON.toJSONString(t));
    }

    /**
     * json 字符串转实体对象
     * @param jsonString
     * @param clazz
     * @param 
     * @return
     */
    public static  T jsonStrToEntity(String jsonString,Class clazz){return JSONObject.parseObject(jsonString,clazz);
    }

    public static void iterateNodes(Element node, JSONObject json) {
        // 获取当前元素的名称
        String nodeName = node.getName();
        // 判断已遍历的 JSON 中是否已经有了该元素的名称
        if (json.containsKey(nodeName)) {
            // 该元素在同级下有多个
            Object Object = json.get(nodeName);
            JSONArray array;
            if (Object instanceof JSONArray) {array = (JSONArray) Object;
            }
            else {array = new JSONArray();
                array.add(Object);
            }
            // 获取该元素下所有子元素
            List listElement = node.elements();
            if (listElement.isEmpty()) {
                // 该元素无子元素,获取元素的值
                String nodeValue = node.getTextTrim();
                array.add(nodeValue);
                json.put(nodeName, array);
                return;
            }
            // 有子元素
            JSONObject newJson = new JSONObject();
            // 遍历所有子元素
            for (Element e : listElement) {
                // 递归
                iterateNodes(e, newJson);
            }
            array.add(newJson);
            json.put(nodeName, array);
            return;
        }
        // 该元素同级下第一次遍历
        // 获取该元素下所有子元素
        List listElement = node.elements();
        if (listElement.isEmpty()) {
            // 该元素无子元素,获取元素的值
            String nodeValue = node.getTextTrim();
            json.put(nodeName, nodeValue);
            return;
        }
        // 有子节点,新建一个 JSONObject 来存储该节点下子节点的值
        JSONObject object = new JSONObject();
        // 遍历所有一级子节点
        for (Element e : listElement) {
            // 递归
            iterateNodes(e, object);
        }
        json.put(nodeName, object);
        return;
    }

    private static void jsonToXmlStr(JSONObject json,StringBuffer buffer,Boolean isEscape){Iterator> it = json.entrySet().iterator();
        Map.Entry en;
        while(it.hasNext()){en = it.next();
            if(en.getKey().startsWith("-")){continue;}
            if(en.getKey().equals("#text")){
                // 直接输出文本
                buffer.append(en.getValue());
                continue;
            }
            if(en.getValue() instanceof JSONObject){buffer.append("");
                JSONObject jo = json.getJSONObject(en.getKey());
                jsonToXmlStr(jo,buffer,isEscape);
                buffer.append("").append(en.getKey()).append(">");
            }else if(en.getValue() instanceof JSONArray){JSONArray jsonArray = json.getJSONArray(en.getKey());
                for (int i = 0; i ");
                    jsonToXmlStr(jsonobject,buffer,isEscape);
                    buffer.append("").append(en.getKey()).append(">");
                }
            }else{buffer.append("").append(isEscape ? escape(String.valueOf(en.getValue())) : String.valueOf(en.getValue())).append("").append(en.getKey()).append(">");
            }
        }
    }

    /**
     * 拼当前节点属性
     * @param json
     * @return
     */
    private static String getAttr(JSONObject json){StringBuilder sb = new StringBuilder();
        for(Map.Entry entity:json.entrySet()){if(entity.getKey().startsWith("-")){sb.append("").append(entity.getKey().substring(1)).append("="").append(entity.getValue().toString()).append(""");
            }
        }
        return sb.toString();}

    /**
     * 特殊字符 pattern
     */
    private static Pattern pattern = Pattern.compile("[&"',]");

    /**
     * json 转 xml 中遇到特殊字符对内容追加![CDATA[]]
     * @param string
     * @return
     */
    private static String escape(String string) {return pattern.matcher(string).find() ? "" : string;}

    /**
     * 判断是否是 JSON 数组
     * @param str
     * @return
     */
    public static boolean isJsonArray(String str) {if (str.isBlank()) {return false;}
        return isWrap(str.trim(), '[', ']');
    }

    public static boolean isWrap(CharSequence str, char prefixChar, char suffixChar) {if (null == str) {return false;}
        return str.charAt(0) == prefixChar && str.charAt(str.length() - 1) == suffixChar;
    }

}

原文地址: 阿里巴巴 fastjson 工具类,xml 与 json 互转

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于2024-10-02发表,共计4225字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)