1. 概述

这是有关 XStream 的系列文章中的第三篇文章。如果您想了解其在Java 对象与 XML 之间相互转换的基本用法,请参阅之前的文章。

除了 XML 处理功能之外,XStream 还可以将 Java 对象与 JSON 相互转换。在本教程中,我们将了解这些功能。

2. 前提条件

在阅读本教程之前,请先阅读本系列的第一篇文章 其中我们解释了该库的基础知识。

3. 依赖关系

<dependency>
    <groupId>com.thoughtworks.xstream</groupId>
    <artifactId>xstream</artifactId>
    <version>1.4.5</version>
</dependency>

4.JSON驱动程序

在前面的文章中,我们学习了如何设置 XStream 实例并选择 XML 驱动程序。同样,有两个驱动程序可用于将对象与 JSON 相互转换: JsonHierarchicalStreamDriverJettisonMappedXmlDriver

4.1. JsonHierarchicalStreamDriver

此驱动程序类可以将对象序列化为 JSON,但无法反序列化回对象。它不需要任何额外的依赖项,并且它的驱动程序类是独立的。

4.2. 抛弃MappedXmlDriver

该驱动程序类能够在 JSON 与对象之间进行转换。使用这个驱动程序类,我们需要为 jettison 添加额外的依赖项 **

<dependency>
    <groupId>org.codehaus.jettison</groupId>
    <artifactId>jettison</artifactId>
    <version>1.3.7</version>
</dependency>

5. 将对象序列化为 JSON

让我们创建一个 Customer 类:

public class Customer {

    private String firstName;
    private String lastName;
    private Date dob;
    private String age;
    private List<ContactDetails> contactDetailsList;
       
    // getters and setters
}

请注意,我们(可能是意外地)将 age 创建为 String 。我们稍后会解释这个选择。

5.1.使用 JsonHierarchicalStreamDriver

我们将传递一个 JsonHierarchicalStreamDriver 来创建一个 XStream 实例。

xstream = new XStream(new JsonHierarchicalStreamDriver());
dataJson = xstream.toXML(customer);

这会生成以下 JSON:

{
  "com.baeldung.pojo.Customer": {
    "firstName": "John",
    "lastName": "Doe",
    "dob": "1986-02-14 16:22:18.186 UTC",
    "age": "30",
    "contactDetailsList": [
      {
        "mobile": "6673543265",
        "landline": "0124-2460311"
      },
      {
        "mobile": "4676543565",
        "landline": "0120-223312"
      }
    ]
  }
}

5.2. JetisonMappedXmlDriver 实现

我们将传递一个 JettisonMappedXmlDriver 类来创建一个实例。

xstream = new XStream(new JettisonMappedXmlDriver());
dataJson = xstream.toXML(customer);

这会生成以下 JSON:

{
  "com.baeldung.pojo.Customer": {
    "firstName": "John",
    "lastName": "Doe",
    "dob": "1986-02-14 16:25:50.745 UTC",
    "age": 30,
    "contactDetailsList": [
      {
        "com.baeldung.pojo.ContactDetails": [
          {
            "mobile": 6673543265,
            "landline": "0124-2460311"
          },
          {
            "mobile": 4676543565,
            "landline": "0120-223312"
          }
        ]
      }
    ]
  }
}

5.3.分析

根据两个驱动程序的输出,我们可以清楚地看到生成的 JSON 存在一些细微的差异。例如, JettisonMappedXmlDriver 省略了数值的双引号,尽管数据类型为 java.lang.String

"mobile": 4676543565,
"age": 30,

另一方面, JsonHierarchicalStreamDriver 保留双引号。

6. 将 JSON 反序列化为对象

让我们将以下 JSON 转换回 Customer 对象:

{
  "customer": {
    "firstName": "John",
    "lastName": "Doe",
    "dob": "1986-02-14 16:41:01.987 UTC",
    "age": 30,
    "contactDetailsList": [
      {
        "com.baeldung.pojo.ContactDetails": [
          {
            "mobile": 6673543265,
            "landline": "0124-2460311"
          },
          {
            "mobile": 4676543565,
            "landline": "0120-223312"
          }
        ]
      }
    ]
  }
}

回想一下,只有一个驱动程序 ( JettisonMappedXMLDriver ) 可以反序列化 JSON。尝试使用 JsonHierarchicalStreamDriver 来实现此目的将导致 UnsupportedOperationException

使用Jettison驱动程序,我们可以反序列化 Customer 对象:

customer = (Customer) xstream.fromXML(dataJson);

七、结论

在本文中,我们介绍了 XStream 的 JSON 处理功能,以及将对象与 JSON 相互转换的功能。我们还研究了如何调整 JSON 输出,使其更短、更简单且更具可读性。

与 XStream 的 XML 处理一样,我们还可以通过使用注释或编程配置配置实例来进一步自定义 JSON 序列化的方式。更多细节和示例,请参阅本系列的第一篇文章

可以从链接的 GitHub 存储库下载带有示例的完整源代码。