Java 解析 XML 转换为 Json

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

posted @ 2024-10-23 21:40  乔京飞  阅读(609)  评论(0编辑  收藏  举报