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