我们使用 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@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