Рубрики
Без рубрики

Джексон – Пользовательский сериализатор

Управляйте выводом JSON с помощью Jackson 2 с помощью пользовательского сериализатора.

Автор оригинала: Eugen Paraschiv.

1. Обзор

В этом кратком руководстве будет показано, как сериализовать объект Java с помощью Jackson 2 с помощью Пользовательского сериализатора .

Если вы хотите копнуть глубже и узнать другие интересные вещи, которые вы можете сделать с помощью Jackson 2 – перейдите к основному учебнику Джексона .

2. Стандартная сериализация графа объектов

Давайте определим 2 простых объекта и посмотрим, как Джексон сериализует их без какой-либо пользовательской логики:

public class User {
    public int id;
    public String name;
}
public class Item {
    public int id;
    public String itemName;
    public User owner;
}

Теперь давайте сериализуем сущность Item с сущностью User :

Item myItem = new Item(1, "theItem", new User(2, "theUser"));
String serialized = new ObjectMapper().writeValueAsString(myItem);

Это приведет к полному представлению JSON для обеих сущностей:

{
    "id": 1,
    "itemName": "theItem",
    "owner": {
        "id": 2,
        "name": "theUser"
    }
}

3. Пользовательский сериализатор на ObjectMapper

Теперь давайте упростим вывод JSON выше , сериализуя только id пользователя , а не весь объект User ; мы хотели бы получить следующий, более простой JSON:

{
    "id": 25,
    "itemName": "FEDUfRgS",
    "owner": 15
}

Проще говоря, нам придется определить пользовательский сериализатор для Элемент объекты:

public class ItemSerializer extends StdSerializer {
    
    public ItemSerializer() {
        this(null);
    }
  
    public ItemSerializer(Class t) {
        super(t);
    }

    @Override
    public void serialize(
      Item value, JsonGenerator jgen, SerializerProvider provider) 
      throws IOException, JsonProcessingException {
 
        jgen.writeStartObject();
        jgen.writeNumberField("id", value.id);
        jgen.writeStringField("itemName", value.itemName);
        jgen.writeNumberField("owner", value.owner.id);
        jgen.writeEndObject();
    }
}

Теперь нам нужно зарегистрировать этот пользовательский сериализатор с помощью ObjectMapper для класса Item и выполнить сериализацию:

Item myItem = new Item(1, "theItem", new User(2, "theUser"));
ObjectMapper mapper = new ObjectMapper();

SimpleModule module = new SimpleModule();
module.addSerializer(Item.class, new ItemSerializer());
mapper.registerModule(module);

String serialized = mapper.writeValueAsString(myItem);

Вот и все – теперь у нас есть более простая, настраиваемая сериализация JSON сущностей Item->User .

4. Пользовательский сериализатор для класса

Мы также можем зарегистрировать сериализатор непосредственно в классе , а не в ObjectMapper :

@JsonSerialize(using = ItemSerializer.class)
public class Item {
    ...
}

Теперь при выполнении стандартной сериализации :

Item myItem = new Item(1, "theItem", new User(2, "theUser"));
String serialized = new ObjectMapper().writeValueAsString(myItem);

Мы получим пользовательский вывод JSON, созданный сериализатором, указанный через @JsonSerialize :

{
    "id": 25,
    "itemName": "FEDUfRgS",
    "owner": 15
}

Это полезно, когда ObjectMapper не может быть доступен и настроен напрямую.

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

В этой статье показано, как получить пользовательский вывод JSON с помощью Jackson 2 с помощью сериализаторов.

Реализацию всех этих примеров и фрагментов кода можно найти на GitHub – это проект на основе Maven, поэтому его должно быть легко импортировать и запускать как есть.