为了让输出的JSON文件更简洁,或者待序列化的类比较复杂,甚至其中某些字段没有实现 Serializable 接口,无法直接进行序列化,此时就需要自定义序列化。
首先定义两个测试类:
public class User {
public int id;
public String name;
}
public class Item {
public int id;
public String itemName;
public User owner;
}
要对 Item 类进行序列化,如果直接进行序列化:
Item myItem = new Item(1, "theItem", new User(2, "theUser"));
String serialized = new ObjectMapper().writeValueAsString(myItem);
输出是这样:
{
"id": 1,
"itemName": "theItem",
"owner": {
"id": 2,
"name": "theUser"
}
}
现在自定义了一个序列化生成器,User 类只对 id 进行序列化,希望得到如下的输出:
{
"id": 25,
"itemName": "FEDUfRgS",
"owner": 15
}
序列化器定义如下:
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 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);
也可以通过注释实现序列化器的注册:
@JsonSerialize(using = ItemSerializer.class)
public class Item {
...
}
在使用时就不需要额外的注册麻烦:
Item myItem = new Item(1, "theItem", new User(2, "theUser"));
String serialized = new ObjectMapper().writeValueAsString(myItem);
最后可获得如下输出:
{
"id": 25,
"itemName": "FEDUfRgS",
"owner": 15
}