Автор оригинала: 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, поэтому его должно быть легко импортировать и запускать как есть.