Джаксън - персонализиран сериализатор

1. Общ преглед

Този бърз урок ще покаже как да сериализирате Java обект с Jackson 2 с помощта на персонализиран сериализатор .

Ако искате да копаете по-дълбоко и да научите други страхотни неща, които можете да правите с 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 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 }

Просто казано, ще трябва да дефинираме персонализиран сериализатор за обекти на артикул :

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 сериализация на обектите -> Потребителски обекти.

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, така че трябва да е лесно да се импортира и да се изпълнява както е.