Найти в Дзене
Уроки по программированию

Jackson – Пользовательский сериализатор

1. Обзор В этом кратком руководстве будет показано, как сериализовать объект Java с помощью 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, приведенный выше, путем сериализации только идентификатора пользователя, а не всего объекта User;
Оглавление

1. Обзор

В этом кратком руководстве будет показано, как сериализовать объект Java с помощью 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, приведенный выше, путем сериализации только идентификатора пользователя, а не всего объекта User; мы хотели бы получить следующий, более простой JSON:

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

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

public class ItemSerializer extends StdSerializer<Item> {

public ItemSerializer() {
this(null);
}

public ItemSerializer(Class<Item> 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 элементов->пользовательских сущностей.

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, используя сериализаторы.

Оригинал статьи: https://www.baeldung.com/jackson-custom-serialization