我们使用 Java 开发项目时偶尔会需要使用到 Xml 文件的解析, 一般情况下都会使用 DOM4j、SAX、JDOM 等方案,但这些方案比较代码编写较为繁琐。我们经常使用的 Json 进行数据传输或存储,如果能够将 Xml 快速转换为 Json,将会大大减轻我们后续开发和维护的工作量。
本篇博客简单介绍使用 net.sf.json-lib 的 json-lib 快速将 Xml 内容转换为 Json 字符串,以及使用 fastjson 将 Json 字符串转换为自定义的实体类对象,大大简化代码的编写量,在博客的最后会提供源代码的下载。
一、搭建工程
新建一个名称为 springboot_xmltojson 的工程,结构如下图:
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
@Test
public 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 转换为实体内对象
@Test
public 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