xml与json互相转换_xml-json互转-程序员宅基地

技术标签: xml  



import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.dom4j.*;

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

/**
 * @author
 */
public class XmlConvert {
    
    /**
     * 属性名前缀
     */
    private String attributeNamePrefix;
    /**
     * 文本键名称
     */
    private String textKey;
    /**
     * 移除xml头文件,<?xml version="1.0" encoding="UTF-8"?>
     */
    private boolean removeHeader;

    public XmlConvert() {
    
        this.setAttributeNamePrefix("@");
        this.setTextKey("#text");
        this.setRemoveHeader(true);
    }

    public XmlConvert(String attributeNamePrefix, String textKey) {
    
        this(attributeNamePrefix, textKey, true);
    }

    public XmlConvert(String attributeNamePrefix, String textKey, boolean removeHeader) {
    
        this.attributeNamePrefix = attributeNamePrefix;
        this.textKey = textKey;
        this.removeHeader = removeHeader;
    }

    /**
     * json转xml<br/>
     * {"abc":["aa","bb"]},此种格式的json串不支持,无根节点; 格式应该为:{"root":{"abc":["aa","bb"]}}
     *
     * @param json
     * @return
     */
    public String jsonToXml(String json) {
    
        JSONObject jsonObject = JSON.parseObject(json);
        Set<String> keySet = jsonObject.keySet();
        if (!keySet.isEmpty() && keySet.size() == 1) {
    
            // 将第一个节点name,作为根节点
            String rootName = keySet.iterator().next();
            Element rootElement = DocumentHelper.createElement(rootName);
            Element element = processObject(jsonObject.get(rootName), rootElement);
            String xml = DocumentHelper.createDocument(element).asXML();
            if (isRemoveHeader()) {
    
                xml = removeHeader(xml);
            }
            return xml;
        } else {
    
            throw new RuntimeException("The json text is not formatted correctly");
        }
    }

    private Element processObject(Object object, Element element) {
    
        if (object instanceof JSONObject) {
    
            return processJSONObject((JSONObject) object, element);
        } else if (object instanceof JSONArray) {
    
            return processJSONArray((JSONArray) object, element, element.getName());
        } else {
    
            return processText(object.toString(), element);
        }
    }

    private static Element processText(String text, Element element) {
    
        element.setText(text);
        return element;
    }

    private Element processJSONObject(JSONObject jsonObject, Element element) {
    
        jsonObject.forEach((key, value) -> {
    
            if (key.startsWith(getAttributeNamePrefix())) {
    
                element.addAttribute(key.substring(getPrefixLength()), value.toString());
            } else if (key.equals(getTextKey())) {
    
                element.setText(value.toString());
            } else {
    
                processValue(element, key, value);
            }
        });
        return element;
    }

    private void processValue(Element element, String name, Object value) {
    
        if (value instanceof JSONObject) {
    
            Element tempElement = processJSONObject((JSONObject) value, DocumentHelper.createElement(name));
            element.add(tempElement);
        } else if (value instanceof JSONArray) {
    
            JSONArray jsonArray = (JSONArray) value;
            int size = jsonArray.size();
            for (int i = 0; i < size; i++) {
    
                processValue(element, name, jsonArray.get(i));
            }
        } else {
    
            Element temp = processText(value.toString(), DocumentHelper.createElement(name));
            element.add(temp);
        }
    }

    private Element processJSONArray(JSONArray jsonArray, Element root, String name) {
    
        int size = jsonArray.size();
        for (int i = 0; i < size; ++i) {
    
            processValue(root, name, jsonArray.get(i));
        }
        return root;
    }

    /**
     * xml转json
     *
     * @param xml
     * @return
     */
    public String xmlToJson(String xml) {
    
        try {
    
            Document document = DocumentHelper.parseText(xml);
            Element rootElement = document.getRootElement();
            JSON json = processObjectElement(rootElement);
            JSONObject jsonObject = new JSONObject();
            jsonObject.put(rootElement.getName(), json);
            return jsonObject.toJSONString();
        } catch (DocumentException e) {
    
            throw new RuntimeException("The XML text is not formatted correctly", e);
        }
    }

    private JSONObject processObjectElement(Element element) {
    
        if (element == null) {
    
            return new JSONObject();
        }
        JSONObject jsonObject = new JSONObject();

        List<Attribute> attributes = element.attributes();
        for (Attribute attribute : attributes) {
    
            String attributeName = getAttributeNamePrefix() + attribute.getName();
            String attributeValue = attribute.getValue();
            setOrAccumulate(jsonObject, attributeName, attributeValue);
        }

        int nodeCount = element.nodeCount();
        for (int i = 0; i < nodeCount; i++) {
    
            Node node = element.node(i);
            if (node instanceof Text) {
    
                Text text = (Text) node;
                setOrAccumulate(jsonObject, getTextKey(), text.getText());
            } else if (node instanceof Element) {
    
                setValue(jsonObject, (Element) node);
            }
        }

        return jsonObject;
    }

    private void setValue(JSONObject jsonObject, Element element) {
    
        if (isObject(element)) {
    
            JSONObject elementJsonObj = processObjectElement(element);
            setOrAccumulate(jsonObject, element.getName(), elementJsonObj);
        } else {
    
            setOrAccumulate(jsonObject, element.getName(), element.getStringValue());
        }
    }

    private boolean isObject(Element element) {
    
        int attributeCount = element.attributeCount();
        if (attributeCount > 0) {
    
            return true;
        }

        int attrs = element.nodeCount();
        if (attrs == 1 && element.node(0) instanceof Text) {
    
            return false;
        } else {
    
            return true;
        }
    }

    private void setOrAccumulate(JSONObject jsonObject, String key, Object value) {
    
        if (jsonObject.containsKey(key)) {
    
            Object obj = jsonObject.get(key);
            if (obj instanceof JSONArray) {
    
                // 若为数组直接添加
                ((JSONArray) obj).add(value);
            } else {
    
                // 若为非数组,创建数组(已存在的值obj,待添加的值value)
                JSONArray jsonArray = new JSONArray();
                jsonArray.add(obj);
                jsonArray.add(value);
                jsonObject.put(key, jsonArray);
            }
        } else {
    
            jsonObject.put(key, value);
        }
    }

    /**
     * 移除xml报文头
     *
     * @param source
     * @return
     */
    private String removeHeader(String source) {
    
        return source.replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>", "")
                .replaceAll("\r|\n", "");
    }


    public String getAttributeNamePrefix() {
    
        return attributeNamePrefix;
    }

    public void setAttributeNamePrefix(String attributeNamePrefix) {
    
        this.attributeNamePrefix = attributeNamePrefix;
    }

    public String getTextKey() {
    
        return textKey;
    }

    public void setTextKey(String textKey) {
    
        this.textKey = textKey;
    }

    public boolean isRemoveHeader() {
    
        return removeHeader;
    }

    public void setRemoveHeader(boolean removeHeader) {
    
        this.removeHeader = removeHeader;
    }

    private int getPrefixLength() {
    
        return this.attributeNamePrefix.length();
    }

}





import net.sf.json.JSON;
import net.sf.json.JSONSerializer;
import net.sf.json.xml.XMLSerializer;

/**
 * @author
 */
public class XmlJsonUtils {
    
    private XmlJsonUtils() {
    
    }

    /**
     * xml转json,默认忽略根节点
     *
     * @param xml
     * @return
     */
    @Deprecated
    public static String xmlToJsonStr(String xml) {
    
        return xmlToJsonStr(xml, false);
    }

    /**
     * xml转json
     *
     * @param xml
     * @param forceTopLevelObject 显示(解析)根节点
     * @return
     */
    @Deprecated
    public static String xmlToJsonStr(String xml, boolean forceTopLevelObject) {
    
        XMLSerializer xmlSerializer = new XMLSerializer();
        xmlSerializer.setForceTopLevelObject(forceTopLevelObject);
        return xmlSerializer.read(xml).toString();
    }

    /**
     * json转xml,默认根节点为o
     *
     * @param jsonStr
     * @return
     */
    @Deprecated
    public static String jsonToXml(String jsonStr) {
    
        return jsonToXml(jsonStr, "");
    }

    /**
     * json转xml
     *
     * @param jsonStr
     * @param rootName 可设置根节点
     * @return
     */
    @Deprecated
    public static String jsonToXml(String jsonStr, String rootName) {
    
        return jsonToXml(jsonStr, rootName, null);
    }

    /**
     * @param jsonStr
     * @param rootName
     * @param elementName
     * @return
     */
    @Deprecated
    public static String jsonToXml(String jsonStr, String rootName, String elementName) {
    
        XMLSerializer xmlSerializer = new XMLSerializer();
        // 关闭类型提示
        xmlSerializer.setTypeHintsEnabled(false);
        // 设置根节点名称
        xmlSerializer.setRootName(rootName);
        xmlSerializer.setElementName(elementName);
        JSON json = getJSON(jsonStr);
        String xmlStr = xmlSerializer.write(json);
        return removeHeaderMessage(xmlStr);
    }

    /**
     * 移除xml报文头
     *
     * @param source
     * @return
     */
    @Deprecated
    private static String removeHeaderMessage(String source) {
    
        return source.replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>", "").replaceAll("\r|\n", "");
    }

    /**
     * json串转换为json对象
     *
     * @param jsonStr
     * @return
     */
    @Deprecated
    private static JSON getJSON(String jsonStr) {
    
        return JSONSerializer.toJSON(jsonStr);
    }

    // 新的xml与json互相转换

    /**
     * xml转json
     *
     * @param xml                 待转换的xml
     * @param attributeNamePrefix xml属性名前缀
     * @param textKey             xml文本键名称
     * @return
     */
    public static String xmlToJSON(String xml, String attributeNamePrefix, String textKey) {
    
        XmlConvert xmlConvert = new XmlConvert(attributeNamePrefix, textKey);
        return xmlConvert.xmlToJson(xml);
    }

    /**
     * xml转json<br/>
     * 默认xml文本键名称为:#text
     *
     * @param xml                 待转换的xml
     * @param attributeNamePrefix xml属性名前缀
     * @return
     */
    public static String xmlToJSON(String xml, String attributeNamePrefix) {
    
        return xmlToJSON(xml, attributeNamePrefix, "#text");
    }

    /**
     * xml转json<br/>
     * 默认xml文本键名称为:#text,xml属性名前缀为'@'
     *
     * @param xml 待转换的xml
     * @return
     */
    public static String xmlToJSON(String xml) {
    
        return xmlToJSON(xml, "@");
    }


    /**
     * json转xml
     *
     * @param json                待转换的json串
     * @param attributeNamePrefix 转换后的xml属性名前缀
     * @param textKey             转换后的xml文本键名称
     * @param removeHeader        移除xml头文件
     * @return
     */
    public static String jsonToXML(String json, String attributeNamePrefix, String textKey, boolean removeHeader) {
    
        XmlConvert xmlConvert = new XmlConvert(attributeNamePrefix, textKey, removeHeader);
        return xmlConvert.jsonToXml(json);
    }

    /**
     * json转xml<br/>
     * 默认转换后移除xml头文件
     *
     * @param json                待转换的json串
     * @param attributeNamePrefix 转换后的xml属性名前缀
     * @param textKey             转换后的xml文本键名称
     * @return
     */
    public static String jsonToXML(String json, String attributeNamePrefix, String textKey) {
    
        return jsonToXML(json, attributeNamePrefix, textKey, true);
    }

    /**
     * json转xml<br/>
     * 默认转换后移除xml头文件,xml文本键名称为#text
     *
     * @param json                待转换的json串
     * @param attributeNamePrefix 转换后的xml属性名前缀
     * @return
     */
    public static String jsonToXML(String json, String attributeNamePrefix) {
    
        return jsonToXML(json, attributeNamePrefix, "#text", true);
    }

    /**
     * json转xml<br/>
     * 默认转换后移除xml头文件,xml文本键名称为#text,属性名前缀为'@'
     *
     * @param json 待转换的json串
     * @return
     */
    public static String jsonToXML(String json) {
    
        return jsonToXML(json, "@");
    }

}


        <!-- xml 解析 start -->
        <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>

        <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.4</version>
            <classifier>jdk15</classifier>
        </dependency>
        <!-- xml解析end -->
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jincheng_921/article/details/90408630

智能推荐

共识(raft)算法_共识算法-程序员宅基地

文章浏览阅读1.6k次。raft算法_共识算法

【Navicat】Cannot load OCI DLL, 87_cannot load oci dll,87-程序员宅基地

文章浏览阅读4k次。使用新安装的 Navicat 第一次连接 Oracle 数据库时,出现如下弹窗。_cannot load oci dll,87

非专业学生如何系统的学习计算机编程?_不学计算机原理可以写程序吗-程序员宅基地

文章浏览阅读7k次,点赞51次,收藏191次。大家好,我是程序员吴师兄,一个坚持在 CSDN 日更原创的程序员。前几天我的一篇文章为什么有人劝别选计算机专业? 上了 CSDN 热榜第一的文章,在此感谢大家的喜爱和 CSDN 的支持,没有看过的同学可以点击蓝色链接前往阅读。发完这篇文章后,有不少的同学私信我,问的最多的一个问题就是:非专业学生如何系统的学习计算机编程?这个问题我在知乎找到一个描述,所以根据这个描述来回答。去年刚毕业,专业是新闻传媒,实习是在一家杂志社做小助理。。。其实小时候就一直对编程非常热爱,一直以来自己有买各种推荐书籍来学,_不学计算机原理可以写程序吗

Pyltp安装以及利用Pyltp进行命名实体识别_pyltp 人名检测-程序员宅基地

文章浏览阅读2.6k次,点赞4次,收藏21次。pyltp环境的搭建:在终端安装pyltp时一般会报错:使用wheel方法:下载wheels下面两个文件针对不同的python版本下载一个即可python-3.5: pyltp-0.2.1-cp35-cp35m-win_amd64.whlhttps://pan.baidu.com/s/1Ekx3dHVzt5raXtiuH-S9qwpython-3.6: pyltp-0.2.1-..._pyltp 人名检测

ZYNQ-实现外设驱动开发-iic接口的温湿度传感器si7021_zynq模拟iic-程序员宅基地

文章浏览阅读1.3k次。学习内容进一步熟悉IIC接口的开发调试,上次工程只是模拟开发,本次将进行实践操作。开发环境vivado 18.3SDKpynq-z2硬件平台搭建参考前文-ZYNQ-实现外设驱动开发-iic接口的光强度传感器GY-30的搭建过程下面给出部分更改操作:这里我们需要把之前选到的MIO改成EMIO同时参考我们的pynq的电路图:进行管脚分配,这里我开始把管脚分配到了AR_SCL和AR_SDA上,试了很多次都不行,然后我就改到了相邻的AR12和A13上,就能正常工作了,这里应该是之前电平一直_zynq模拟iic

挖矿病毒常见处置方法_wmic process get caption,commandline /value >> tmp-程序员宅基地

文章浏览阅读4.3k次,点赞4次,收藏40次。挖矿病毒特征:“挖矿”病毒是一段恶意代码或者一个软件,一般利用主机或者操作系统的高危漏洞术在局域网内传播,控制电脑进行大量的计算机运算来获取虚拟货币。该病毒会消耗大量的计算机处理资源,常见的就是系统中毒后系统CPU占用接近100%、系统卡顿执行基本命令响应缓慢、系统出现异常进程无法正常kill、系统内存异常占用不稳定等。常见攻击方式:不明邮件附件、文件、连接和网页、不明U盘随意接入、非官方软件和服务器弱口令、高危端口暴露等事件大概处置流程:详细流程、操作命令。_wmic process get caption,commandline /value >> tmp.txt

随便推点

VScode通过remote ssh连接虚拟机 & 报错 过程试图写入的管道不存在(已解决)-程序员宅基地

文章浏览阅读5w次,点赞31次,收藏72次。因为在windows上VSCode使用的默认ssh工具存在实现上的问题,导致一旦我们直接使用默认ssh连接会有报错:”过程试图写入的管道不存在”(The process tried to write to a nonexistent pipe)。那出现这样的问题我们有两种解决办法。解决办法一:安装open ssh,并在设置ProxyCommand时使用安装好的openssh..._过程试图写入的管道不存在

绘制甘特图(DHX gantt)-程序员宅基地

文章浏览阅读918次。用于管理时间和任务活动的工具_dhx gantt

一口气请来Hinton等6位图灵奖得主、10多位院士,这场持续4天的AI盛会想干什么?_图灵奖 获得者名单-程序员宅基地

文章浏览阅读477次。大数据文摘出品邀请六位图灵奖得主齐聚,这可能是一场人工智能峰会的最大诚意了。但2020北京智源大会对于人工智能的热情远不止于此。2020年6月21-24日,第二届北京智源大会将邀请包括6位图灵奖获得者、10多位院士在内的上百位人工智能领袖,回顾过去,展望未来,深入系统探讨“人工智能的下一个十年”。先来看看到场嘉宾,阵容之豪华,也难怪业内传言:如果你今年只能参加一场人工智能大会,那么就是它了!6位图灵奖获得者、10多位院士齐聚全球抗疫的大背景下,本次..._图灵奖 获得者名单

三级嵌入式总结版_powerpc是哈佛结构吗-程序员宅基地

文章浏览阅读1.3w次,点赞96次,收藏253次。2018年3月16日,3月24日即要考试!一周的紧促复习时间,是时候来个总结了!加油!!!嵌入式系统嵌入式系统上的软件具有结构精简,代码轻量化,占用存储资源少的特点。嵌入式系统和计算机操作系统的共同特征是:引导加载程序、外设驱动程序、操作系统、文件系统、网络协议栈、图形用户界面、数据库。嵌入式系统应用开发工具的主要目的:提高开发质量,缩短开发周期,降低开发成本。按照软硬件技术的..._powerpc是哈佛结构吗

inet_addr 和inet_ntoa_inet_addr inet_ntoa-程序员宅基地

文章浏览阅读378次。// inet_addr.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include //htonl() 将主机的无符号长整形数转换成网络字节顺序//htons() 将主机的无符号短整形数转换成网络字节顺序//ntohl() 将一个无符号长整形数从网络字节顺序转换为主机字节顺序。//_inet_addr inet_ntoa

GPT_MBR与GPT分区扫盲,希捷2T、3T硬盘测评-程序员宅基地

文章浏览阅读274次。运气不好,两只1T硬盘先后出现异常(2010年最先降到¥399的日立HDS721010CLA332,以及希捷12代ST31000528AS)。泰国水灾导致的硬盘价暴升,还未恢复,但避免重要的N多硬盘数据不保,还是果段决定换硬盘。最近500G大概¥400,1T大概¥560,2T大概¥700,3T大概¥1000+。500G暂时在岗顶还是出货量最大,适合普通用户装机,但显然最没有...

推荐文章

热门文章

相关标签