Отображение JSON

Этот раздел перенесён из документации Camunda 7 и в дальнейшем будет доработан с учётом особенностей OpenBPM Engine

Spin может десериализовать JSON в Java-объекты и сериализовать Java-объекты в JSON, интегрируя возможности отображения Jackson в свой fluent API.

Преобразование между представлениями

Предположим, у нас есть класс Customer, определённый следующим образом:

public class Customer {

  private String name;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

Отображение JSON в Java

Мы можем отобразить JSON-объект {"name" : "Kermit"} в экземпляр Customer следующим образом:

import static io.openbpm.spin.Spin.JSON;

Customer customer = JSON("{\"customer\": \"Kermit\"}").mapTo(Customer.class);

Отображение Java в JSON

Мы можем преобразовать customer обратно в JSON следующим образом:

import static io.openbpm.spin.Spin.JSON;

String json = JSON(customer).toString();

Также можно отображать Java-примитивы, такие как boolean или числа, в соответствующие JSON-значения. Например, JSON(true) отображается в JSON-константу булевого значения true. Обратите внимание, что строковые значения не конвертируются, а интерпретируются как JSON-ввод (см. Чтение JSON). Например, JSON("a String") выбрасывает исключение, поскольку "a String" не является корректным JSON. Тем не менее список строковых значений корректно преобразуется в JSON-массив строк.

Отображение в обобщённые типы

Предположим, у нас есть список клиентов, который мы объявили бы как List<Customer> в Java. Для отображения JSON-массива [{"name" : "Kermit"}, {"name" : "Hugo"}] в такой список вызов mapTo(ArrayList.class) недостаточен, так как Jackson не может определить тип элементов массива. Эту задачу можно решить, передав в mapTo строку с каноническим именем типа в соответствии с соглашениями Jackson:

import static io.openbpm.spin.Spin.JSON;

String json = "[{\"customer\": \"Kermit\"}, {\"customer\": \"Kermit\"}]"

List<Customer> customers = JSON(json).mapTo("java.util.ArrayList<somepackage.Customer>");

Отображение в полиморфные типы

Отображение JSON в Java-объекты представляет особую сложность, поскольку JSON не содержит информации о типах, необходимой для десериализации в Java-объекты. В приведённых выше примерах мы явно указывали Spin отображать JSON-объект в Customer с помощью метода mapTo. Для вложенных JSON-объектов Jackson может определить нужный тип десериализации, анализируя объявленные поля переданного класса. Однако это не работает для полиморфных типов. Рассмотрим следующий пример, где у Customer есть ссылка на Car.

public class Customer {

  private String name;
  private Car car;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public Car getCar() {
    return car;
  }

  public void setCar(Car car) {
    this.car = car;
  }
}

Предположим, что Car — это интерфейс с различными реализациями, такими как StationWagon или Van. Jackson не может определить, какую реализацию использовать, основываясь только на статической структуре Customer. В таких случаях Jackson опирается на информацию о типах, содержащуюся в JSON. Доступные варианты настройки сериализации и десериализации типов описаны в документации Jackson https://github.com/FasterXML/jackson-docs/wiki/JacksonPolymorphicDeserialization. Настроить эти параметры в Spin можно, как описано в разделе конфигурации.

Лицензия и атрибуция

Эта документация была создана на базе материала "Camunda 7 Docs" от Camunda, находится под лицензией Creative Commons Attribution-ShareAlike 3.0 Unported License .

Оригинал документации: https://docs.camunda.org