Java实现XML与JSON的互相转换详解

 更新时间:2025年03月19日 14:48:50   作者:心的步伐  
这篇文章主要为大家详细介绍了如何使用Java实现XML与JSON的互相转换,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

1. XML转JSON

1.1 代码目的

实现xml与json的互相转换,先实现xml -> json, 然后实现json -> xml字符串,最后xml字符串 -> 写入文件

XML结构时常会转换为JSON数据结构,感恩开源,有json的开源包帮忙解决问题。

1.2 代码实现

下面代码是xml转json的快速方法

public static String xmlToJson() throws Exception{
        //使用DOM4j
        SAXReader saxReader = new SAXReader();
        //读取文件
        Document read = saxReader.read("G:\\IDEAProjects\\JavaStudy\\Mooc\\src\\main\\resources\\score.xml");
        //使用json的xml转json方法
        JSONObject jsonObject = XML.toJSONObject(read.asXML());
        //设置缩进转为字符串
        System.out.println(jsonObject.toString(3));
        return jsonObject.toString(3);
    }

测试xml文件如下

<?xml version='1.0' encoding='UTF-8'?>
<student>
    <name>Tom</name>
    <subject>math</subject>
    <score>80</score>
</student>

输出结果:

{"student": 
 {
   "score": 80,
   "subject": "math",
   "name": "Tom"
 }
}

2. JSON转XML

    //json转换成xml
    public static String jsonToXml(String json){
        //输入流
        StringReader input = new StringReader(json);
        //输出流
        StringWriter output = new StringWriter();
        //构建配置文件
        JsonXMLConfig config = new JsonXMLConfigBuilder().multiplePI(false).repairingNamespaces(false).build();
        try {
                //xml事件读
                //  This is the top level interface for parsing XML Events.  It provides
                //  the ability to peek at the next event and returns configuration
                //  information through the property interface.
                // 这是最解析XML事件最顶层的接口,它提供了查看下一个事件并通过属性界面返回配置信息的功能。
                XMLEventReader reader = new JsonXMLInputFactory(config).createXMLEventReader(input);
                //这是编写XML文档的顶级界面。
                //验证XML的形式不需要此接口的实例。
                XMLEventWriter writer = XMLOutputFactory.newInstance().createXMLEventWriter(output);
                //创建一个实例使用默认的缩进和换行
                writer = new PrettyXMLEventWriter(writer);
                //添加整个流到输出流,调用next方法,知道hasnext返回false
                writer.add(reader);
                reader.close();
                writer.close();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                    try {
                            output.close();
                            input.close();
                        } catch (IOException e) {
                                e.printStackTrace();
                        }
                     }
            //移除头部标签
            if (output.toString().length() >= 38) {
                System.out.println(output.toString().substring(39));
                return output.toString().substring(39);
            }
        System.out.println(output);
        return output.toString();
    }

传入的json字符串即上xml转json中输出的,json转xml的结果如下:

此时是没有头部,在文中被移除!

<student>
    <score>80</score>
    <subject>math</subject>
    <name>Tom</name>
</student>

3. JSON转XML并输出成指定的文件

传入xml字符串,利用DOM4J工具即可输出到指定的文件

public static void writeXmlToFile(String xmlStr) throws Exception{
        //将xmlstr转为文件形式
        Document document = DocumentHelper.parseText(xmlStr);
        //设置输出的格式
        OutputFormat format = OutputFormat.createPrettyPrint();
        //构建输出流
        XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("newXml.xml"), format);
        //不要转义字符
        xmlWriter.setEscapeText(false);
        //写入
        xmlWriter.write(document);
        //关闭流
        xmlWriter.close();
    }

4. 主要的pom.xml配置如下

如下的依赖就足够了

	<dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20171018</version>
        </dependency>
        <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>
        <dependency>
            <groupId>de.odysseus.staxon</groupId>
            <artifactId>staxon</artifactId>
            <version>1.3</version>
        </dependency>

5. 整体代码

public class Main {
    public static void main(String[] args)throws Exception {
        //将xml转化成json
        String jsonStr = xmlToJson();
        //将json转换成xml
        String xmlStr = jsonToXml(jsonStr);
        //将json按照响应格式写入score2.xml
        writeXmlToFile(xmlStr);

    }

    public static String xmlToJson() throws Exception{
        //使用DOM4j
        SAXReader saxReader = new SAXReader();
        //读取文件
        Document read = saxReader.read("G:\\IDEAProjects\\JavaStudy\\Mooc\\src\\main\\resources\\score.xml");
        //使用json的xml转json方法
        JSONObject jsonObject = XML.toJSONObject(read.asXML());
        //设置缩进转为字符串
        System.out.println(jsonObject.toString(3));
        return jsonObject.toString(3);
    }

    public static void writeXmlToFile(String xmlStr) throws Exception{
        //将xmlstr转为文件形式
        Document document = DocumentHelper.parseText(xmlStr);
        //设置输出的格式
        OutputFormat format = OutputFormat.createPrettyPrint();
        //构建输出流
        XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("G:\\IDEAProjects\\JavaStudy\\Mooc\\src\\main\\resources\\score2.xml"), format);
        //不要转义字符
        xmlWriter.setEscapeText(false);
        //写入
        xmlWriter.write(document);
        //关闭流
        xmlWriter.close();
    }


    //json转换成xml
    public static String jsonToXml(String json){
        //输入流
        StringReader input = new StringReader(json);
        //输出流
        StringWriter output = new StringWriter();
        //构建配置文件
        JsonXMLConfig config = new JsonXMLConfigBuilder().multiplePI(false).repairingNamespaces(false).build();
        try {
                //xml事件读
                //  This is the top level interface for parsing XML Events.  It provides
                //  the ability to peek at the next event and returns configuration
                //  information through the property interface.
                // 这是最解析XML事件最顶层的接口,它提供了查看下一个事件并通过属性界面返回配置信息的功能。
                XMLEventReader reader = new JsonXMLInputFactory(config).createXMLEventReader(input);
                //这是编写XML文档的顶级界面。
                //验证XML的形式不需要此接口的实例。
                XMLEventWriter writer = XMLOutputFactory.newInstance().createXMLEventWriter(output);
                //创建一个实例使用默认的缩进和换行
                writer = new PrettyXMLEventWriter(writer);
                //添加整个流到输出流,调用next方法,知道hasnext返回false
                writer.add(reader);
                reader.close();
                writer.close();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                    try {
                            output.close();
                            input.close();
                        } catch (IOException e) {
                                e.printStackTrace();
                        }
                     }
            //移除头部标签
            if (output.toString().length() >= 38) {
                System.out.println(output.toString().substring(39));
                return output.toString().substring(39);
            }
        System.out.println(output);
        return output.toString();
    }
}

到此这篇关于Java实现XML与JSON的互相转换详解的文章就介绍到这了,更多相关Java XML与JSON互转内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Idea配置超详细图文教程(2020.2版本)

    Idea配置超详细图文教程(2020.2版本)

    这篇文章主要介绍了Idea配置超详细图文教程(2020.2版本),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • 从零搭建脚手架之集成Spring Retry实现失败重试和熔断器模式(实战教程)

    从零搭建脚手架之集成Spring Retry实现失败重试和熔断器模式(实战教程)

    在我们的大多数项目中,会有一些场景需要重试操作,而不是立即失败,让系统更加健壮且不易发生故障,这篇文章主要介绍了从零搭建开发脚手架之集成Spring Retry实现失败重试和熔断器模式,需要的朋友可以参考下
    2022-07-07
  • spring中使用@Autowired注解无法注入的情况及解决

    spring中使用@Autowired注解无法注入的情况及解决

    这篇文章主要介绍了spring中使用@Autowired注解无法注入的情况及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java利用Request请求如何获取IP地址对应的省份、城市详解

    Java利用Request请求如何获取IP地址对应的省份、城市详解

    之前已经给大家介绍了关于Java用Request请求获取IP地址的相关内容,那么下面这篇文章将给大家进入深入的介绍,关于Java利用Request请求如何获取IP地址对应省份、城市的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-10-10
  • SpringBoot执行定时任务@Scheduled的方法

    SpringBoot执行定时任务@Scheduled的方法

    这篇文章主要介绍了SpringBoot执行定时任务@Scheduled的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • vscode 配置java环境并调试运行的详细过程

    vscode 配置java环境并调试运行的详细过程

    这篇文章主要介绍了vscode 配置java环境并调试运行的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-05-05
  • Java基础Map集合详析

    Java基础Map集合详析

    这篇文章主要介绍了Java基础Map集合详析,主要通过介绍Map集合的常用方法、Map的获取方法的一些相关资料展开内容,需要的小伙伴可以参考一下
    2022-04-04
  • Java 详解分析链表的中间节点

    Java 详解分析链表的中间节点

    链表是基本的数据结构之一,面试题中链表占很大一部分,可见链表操作是非常重要的。本篇文章我们来探究一下如何获取链表的中间节点
    2022-01-01
  • Spring @Conditional注解从源码层讲解

    Spring @Conditional注解从源码层讲解

    @Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean,这篇文章主要介绍了Spring @Conditional注解示例详细讲解,需要的朋友可以参考下
    2023-01-01
  • Spring中的三级缓存与循环依赖详解

    Spring中的三级缓存与循环依赖详解

    Spring三级缓存是Spring框架中用于解决循环依赖问题的一种机制,这篇文章主要介绍了Spring三级缓存与循环依赖的相关知识,本文给大家介绍的非常详细,需要的朋友可以参考下
    2024-05-05

最新评论