1.概述
如何使用自定义序列化器,使用Jackson 2序列化Java实体。
2.对象的标准序列化
定义2个简单实体,看看Jackson如何在没有任何自定义逻辑的情况下序列化这些实体:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
public int id;
public String name;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Item {
public int id;
public String itemName;
public User owner;
}
现在,序列化一个Item实体和一个User实体:
@Test
public void test1() throws JsonProcessingException {
Item myItem = new Item(1, "theItem", new User(2, "theUser"));
String serialized = new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(myItem);
System.out.println(serialized);
}
输出结果:
{
"id" : 1,
"itemName" : "theItem",
"owner" : {
"id" : 2,
"name" : "theUser"
}
}
3.ObjectMapper上的自定义序列化程序
现在,仅通过序列化User的ID(而不是整个User对象)来简化上面的JSON输出。 希望获取以下更简单的JSON:
{
"id": 25,
"itemName": "FEDUfRgS",
"owner": 15
}
简而言之,必须为Item对象定义一个自定义序列化器:
public class ItemSerializer extends StdSerializer<Item> {
public ItemSerializer() {
this(null);
}
public ItemSerializer(Class<Item> t) {
super(t);
}
@Override
public void serialize(Item item, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeStartObject();
jsonGenerator.writeNumberField("id", item.id);
jsonGenerator.writeStringField("itemName", item.itemName);
jsonGenerator.writeNumberField("owner", item.owner.id);
jsonGenerator.writeEndObject();
}
}
@Test
public void test2() throws JsonProcessingException {
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);
System.out.println(serialized);
}
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时,这将很有帮助。