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 .