jackson 自定义序列化

来源:互联网 发布:音频制作软件下载 编辑:程序博客网 时间:2024/05/17 12:55

为了让输出的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}