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 相互转换: JsonHierarchicalStreamDriver 和 JettisonMappedXmlDriver 。
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 存储库下载带有示例的完整源代码。