1. Overview

This quick tutorial will show how to serialize a Java entity with Jackson 2 using a Custom Serializer.

If you want to dig deeper and learn other cool things you can do with the Jackson 2 – head on over to the main Jackson tutorial.

2. Standard Serialization of an Object Graph

Let's define 2 simple entities and see how Jackson serializes these without any custom logic:

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

Now, let's serialize an Item entity with a User entity:

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

This will result in a full JSON representation for both entities:

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

3. Custom Serializer on the ObjectMapper

Now, let's simplify the JSON output above by only serializing the id of the User, not the entire User object; we'd like to get the following, simpler JSON:

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

Simply put, we'll have to define a custom Serializer for Item objects:

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(); } }

Now, we need to register this custom serializer with the ObjectMapper for the Item class, and perform the serialization:

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);

That's it – we now have a simpler, custom JSON serialization of the Item->User entities.

4. Custom Serializer on the Class

We can also register the serializer directly on the class, instead of on the ObjectMapper:

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

Now, when performing standard serialization:

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

We will get the custom JSON output, created by the serializer, specified via @JsonSerialize:

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

This is helpful when the ObjectMapper cannot be accessed and configured directly.

5. Conclusion

This article illustrated how to get to a custom JSON output with Jackson 2, by using Serializers.

The implementation of all these examples and code snippets can be found on GitHub – this is a Maven-based project, so it should be easy to import and run as it is.