Java 解析 XML 转换为 Json

news/2024/10/23 21:44:00/文章来源:https://www.cnblogs.com/studyjobs/p/18498424

我们使用 Java 开发项目时偶尔会需要使用到 Xml 文件的解析, 一般情况下都会使用 DOM4j、SAX、JDOM 等方案,但这些方案比较代码编写较为繁琐。我们经常使用的 Json 进行数据传输或存储,如果能够将 Xml 快速转换为 Json,将会大大减轻我们后续开发和维护的工作量。

本篇博客简单介绍使用 net.sf.json-lib 的 json-lib 快速将 Xml 内容转换为 Json 字符串,以及使用 fastjson 将 Json 字符串转换为自定义的实体类对象,大大简化代码的编写量,在博客的最后会提供源代码的下载。


一、搭建工程

新建一个名称为 springboot_xmltojson 的工程,结构如下图:

image

resources 目录下的 employ.xml 是需要解析的 Xml 样例文件

entity 是按照 Xml 文件转换后的 Json 字段,创建的一些实体类,主要用来将 Json 字符串转换为实体类对象

XmlToJsonTest 类中编写了两个测试方法,展示了读取 xml 文件内容转换为 Json 字符串,以及将 Json 字符串转换为自定义的实体类对象。

下面看一下 pom 文件内容,主要引入了 xom、json-lib、fastjson 这 3 个依赖包:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.jobs</groupId><artifactId>springboot_xmltojson</artifactId><version>1.0</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.5</version></parent><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><scope>compile</scope></dependency><!--引入 xom 依赖包--><dependency><groupId>xom</groupId><artifactId>xom</artifactId><version>1.3.9</version></dependency><!--引入 json-lib 依赖包--><dependency><groupId>net.sf.json-lib</groupId><artifactId>json-lib</artifactId><version>2.4</version></dependency><!--引入 fastjson 依赖包 --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.53</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency></dependencies>
</project>

二、代码细节

employ.xml 文件内容如下:

<?xml version="1.0" encoding="utf-8" ?>
<company><cname>xxx公司</cname><leader>xxx领导</leader><department><dname>销售部</dname><employee><id>1</id><name>任肥肥</name><age>37</age><salary>3600</salary></employee><employee><id>2</id><name>李墩墩</name><age>24</age><salary>4600</salary></employee></department><department><dname>研发部</dname><employee><id>4</id><name>侯胖胖</name><age>40</age><salary>3800</salary></employee><employee><id>5</id><name>蔺赞赞</name><age>35</age><salary>5000</salary></employee><employee><id>6</id><name>乔豆豆</name><age>41</age><salary>4500</salary></employee></department>
</company>

Company 的实体类代码如下:

package com.jobs.entity;import lombok.Data;
import java.util.List;@Data
public class Company {private String cname;private String leader;private List<Department> department;
}

Department 的实体类代码如下:

package com.jobs.entity;import lombok.Data;
import java.util.List;@Data
public class Department {private String dname;private List<Employee> employee;
}

Employee 的实体类如下:

package com.jobs.entity;import lombok.Data;@Data
public class Employee {private Integer id;private String name;private Integer age;private Integer salary;
}

XmlToJsonTest 测试类的代码如下:

package com.jobs;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.jobs.entity.Company;
import net.sf.json.xml.XMLSerializer;
import org.apache.commons.lang.StringUtils;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.io.Resource;import java.io.BufferedReader;
import java.io.FileReader;@SpringBootTest
public class XmlToJsonTest {//从当前项目中的 resources 目录下寻找 test.nc 文件@Value("classpath:employ.xml")private Resource resource;//读取 xml 文件转 json@Testpublic void test1() throws Exception {//读取 xml 文件的内容StringBuilder sb = new StringBuilder();try (BufferedReader br = new BufferedReader(new FileReader(resource.getFile()))) {String line = br.readLine();while (StringUtils.isNotBlank(line)) {sb.append(line);line = br.readLine();}}XMLSerializer xmlSerializer = new XMLSerializer();net.sf.json.JSON read = xmlSerializer.read(sb.toString());String jsonString = read.toString();System.out.println(jsonString);}//读取 xml 文件转 json,再将 json 转换为实体内对象@Testpublic void test2() throws Exception {//读取 xml 文件的内容StringBuilder sb = new StringBuilder();try (BufferedReader br = new BufferedReader(new FileReader(resource.getFile()))) {String line = br.readLine();while (StringUtils.isNotBlank(line)) {sb.append(line);line = br.readLine();}}XMLSerializer xmlSerializer = new XMLSerializer();net.sf.json.JSON read = xmlSerializer.read(sb.toString());String jsonString = read.toString();//将 json 字符串,转换为自定义的实体类对象Company company = JSON.parseObject(jsonString, new TypeReference<Company>() {});System.out.println(company);}
}

最后列出 employee.xml 解析后转换的 Json 字符串内容:

{"cname": "xxx公司","leader": "xxx领导","department": [{"dname": "销售部","employee": [{"id": "1","name": "任肥肥","age": "37","salary": "3600"},{"id": "2","name": "李墩墩","age": "24","salary": "4600"}]},{"dname": "研发部","employee": [{"id": "4","name": "侯胖胖","age": "40","salary": "3800"},{"id": "5","name": "蔺赞赞","age": "35","salary": "5000"},{"id": "6","name": "乔豆豆","age": "41","salary": "4500"}]}]
}

本篇博客的源代码下载地址为:https://files.cnblogs.com/files/blogs/699532/springboot_xmltojson.zip

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/820870.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

热力学与统计力学

统计力学 泊松分布 \[P(k,\lambda)=\frac{\lambda e^{-k}}{k!} \]其中\(\lambda\)是期望的事件数,k是观测到的事件数。 玻尔兹曼分布 \[P_i=\frac{e^{-\beta E_i}}{Z} \]其中\(P_i\)是状态i的概率,\(\beta=\frac{1}{KT}\) Z是配分函数\(Z=\sum_j e^{-\beta E_j}\) 麦克斯韦-玻…

20222409 2024-2025-1 《网络与系统攻防技术》实验二实验报告

1.实验内容 1.1 本周学习内容后门技术:学习了后门的定义及其在网络安全中的作用。后门是一种隐秘的进入方式,允许攻击者绕过正常的认证机制,获取系统访问权限。在实验中实践了如何利用后门获取shell。 netcat:可以用于创建TCP/UDP连接,实现远程shell访问和文件传输。 soca…

经典力学

经典力学 概述 包括运动学和动力学,附加一套分析力学的语言其实就是这一部分的全部核心了。利用最基础的力、能量、动量、速度、加速度等概念再加上目前的这些基本定理自己就可以解决所有的经典力学问题。不过应试的时候还是需要我们去背记一些模型甚至是公式以便加快解题速度…

宝塔面板安装教程

安装前请确保是【全新的机器】,没有安装其他任何环境,否则会影响您的业务使用! 填写好服务器信息,点击“立即安装到服务器”即全自动完成安装,在安装过程中请勿刷新页面! 数据传输过程中加密处理,不保存任何账号密码信息,请放心使用。 系统兼容性推荐:CentOS 7.x >…

FEE-Frontiers in Ecology and Evolution

Frontiers in Ecology and Evolution是一本经同行评议的基础科学和应用科学研究期刊,为自然和人类世界提供生态学和进化的见解。@目录一、征稿简介二、重要信息三、服务简述四、投稿须知 一、征稿简介二、重要信息期刊官网:https://ais.cn/u/3eEJNv三、服务简述 Frontiers in…

实验2 C++

任务1: t.h1 #pragma once2 3 #include <string>4 5 // 类T: 声明6 class T {7 // 对象属性、方法8 public:9 T(int x = 0, int y = 0); // 普通构造函数 10 T(const T &t); // 复制构造函数 11 T(T &&t); // 移动构造函数 12 ~T(…

FPS-Frontiers in Plant Science

Frontiers in Plant Science是在植物研究领域领先的期刊,通过出版严格的同行评审来推动我们对于植物生物学这一领域认知的进步,这本多学科开放获取期刊处于向全球研究人员、学者、政策制定者和公众传播和交流科学知识和有影响力的发现的最前沿。从作物分子遗传学、细胞生物学…

PbootCMS后台管理界面布局错乱,样式不正常怎么办

问题描述:后台管理界面布局错乱,样式不正常。 解决方案:检查CSS文件:确保CSS文件路径正确,文件加载正常。 检查文件权限:确保CSS文件的权限设置正确。 清除浏览器缓存:清除浏览器缓存,重新加载页面。 检查Web服务器配置:确保Web服务器配置正确,特别是静态文件的配置。…

cyi 源鲁杯2024第一轮wp

2024“源鲁杯”高校网络安全技能大赛Round 1 Misc [Round 1] hide_png stegsolve黑白通道(需要自己适当调整大小),然后丁真YLCTF{a27f2d1a-9176-42cf-a2b6-1c87b17b98dc} [Round 1] plain_crack 给了build.py和初始的build,压缩后发现两个文件一样,且加密算法为zipcrypto,…

学期2024-2025-1 学号20241424 《计算机基础与程序设计》第5周学习总结

学期2024-2025-1 学号20241424 《计算机基础与程序设计》第5周学习总结 作业信息 |这个作业属于2024-2025-1-计算机基础与程序设计)| |-- |-- | |这个作业要求在|(https://www.cnblogs.com/rocedu/p/9577842.html#WEEK05))| |这个作业的目标|<参考上面的学习总结模板,把学…

立博为证

12345我他妈要是再在没仔细思考一个小时之前就瞎几把看讨论区和标签,然后看到一些若有若无的傻逼言论,然后瞎几把看题解我就吃屎,天天做题是他妈让你瞎看标签和讨论浪费好题的? 原因如图

2024秋软工实践 第二小组团队展示与选题报告

作业所属课程 https://edu.cnblogs.com/campus/fzu/SE2024作业要求 https://edu.cnblogs.com/campus/fzu/SE2024/homework/13290作业的目标 初步决定大作业选题,并进行需求分析和答辩团队名称 旺仔水饺102201140 黎曼 102201130 黄俊瑶102201127 罗永辉 102201130 郑哲浩10220…