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

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

1. обзор

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

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

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

Перед чтением этого руководства перейдите по ссылке: / xstream-serialize-object-to-xml,, в которой мы объясняем основы библиотеки.

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


    com.thoughtworks.xstream
    xstream
    1.4.5

4. Драйверы JSON

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

4.1. JsonHierarchicalStreamDriverс

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

4.2. JettisonMappedXmlDriverс

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


    org.codehaus.jettison
    jettison
    1.3.7

5. Сериализация объекта в JSON

Создадим классCustomer:

public class Customer {

    private String firstName;
    private String lastName;
    private Date dob;
    private String age;
    private List contactDetailsList;

    // getters and setters
}

Обратите внимание, что мы (возможно, неожиданно) создалиage какString. Мы объясним этот выбор позже.

5.1. ИспользуяJsonHierarchicalStreamDriver

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

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

Это создает следующий JSON:

{
  "com.example.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.example.pojo.Customer": {
    "firstName": "John",
    "lastName": "Doe",
    "dob": "1986-02-14 16:25:50.745 UTC",
    "age": 30,
    "contactDetailsList": [
      {
        "com.example.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.example.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 путем настройки экземпляра с использованием аннотаций или программной конфигурации. Дополнительные сведения и примеры см. Вfirst article in this series.

Полный исходный код с примерами можно скачать сlinked GitHub repository.