Перейти к основному содержимому

Руководство пользователя XStream: JSON

· 3 мин. чтения

1. Обзор

Это третья статья из серии о XStream. Если вы хотите узнать о его основном использовании для преобразования объектов Java в XML и наоборот , обратитесь к предыдущим статьям.

Помимо возможностей обработки XML, XStream также может преобразовывать объекты Java в JSON и обратно. В этом уроке мы узнаем об этих функциях.

2. Предпосылки

Прежде чем читать это руководство, ознакомьтесь с первой статьей из этой серии , в которой мы объясняем основы работы с библиотекой.

3. Зависимости

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

4. JSON-драйверы

В предыдущих статьях мы узнали, как настроить экземпляр XStream и выбрать драйвер XML. Аналогичным образом, для преобразования объектов в JSON и из него доступны два драйвера: JsonHierarchicalStreamDriver и JettisonMappedXmlDriver .

4.1. JsonHierarchicalStreamDriver

Этот класс драйвера может сериализовать объекты в JSON, но не может десериализовать обратно в объекты. Он не требует никаких дополнительных зависимостей, а его класс драйвера автономен.

4.2. Джеттисонмаппедксмлдрайвер

Этот класс драйвера способен преобразовывать JSON в объекты и из них. Используя этот класс драйвера, нам нужно добавить дополнительную зависимость для jettison .

<dependency>
<groupId>org.codehaus.jettison</groupId>
<artifactId>jettison</artifactId>
<version>1.4.1</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.foreach.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. Реализация JettisonMappedXmlDriver

Мы передадим класс JettisonMappedXmlDriver для создания экземпляра.

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

Это генерирует следующий JSON:

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

Напомним, что только один из драйверов ( JettisonMappedXMLDriver ) может десериализовать JSON. Попытка использовать JsonHierarchicalStreamDriver для этой цели приведет к UnsupportedOperationException . ``

Используя драйвер Jettison, мы можем десериализовать объект Customer :

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

7. Заключение

В этой статье мы рассмотрели возможности обработки JSON XStream, преобразования объектов в JSON и обратно. Мы также рассмотрели, как можно настроить вывод JSON, сделав его короче, проще и читабельнее.

Как и в случае с обработкой XML в XStream, существуют и другие способы дальнейшей настройки способа сериализации JSON путем настройки экземпляра с использованием либо аннотаций, либо программной конфигурации. Дополнительные сведения и примеры см. в первой статье этой серии .

Полный исходный код с примерами можно скачать из связанного репозитория GitHub .