为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Jackson中使用自定义Serializer?

如何在Jackson中使用自定义Serializer?

ibeautiful 2019-07-24 19:11:57
如何在Jackson中使用自定义Serializer?我有两个Java类,我想使用Jackson序列化为JSON:public class User {     public final int id;     public final String name;     public User(int id, String name) {         this.id = id;         this.name = name;     }}public class Item {     public final int id;     public final String itemNr;     public final User createdBy;     public Item(int id, String itemNr, User createdBy) {         this.id = id;         this.itemNr = itemNr;         this.createdBy = createdBy;     }}我想将Item序列化为此JSON:{"id":7, "itemNr":"TEST", "createdBy":3}用户序列化只包括id。我还可以将所有用户对象serilize为JSON,如:{"id":3, "name": "Jonas", "email": "jonas@example.com"}所以我想我需要编写一个自定义序列化器Item并尝试使用它:public class ItemSerializer extends JsonSerializer<Item> {@Overridepublic void serialize(Item value, JsonGenerator jgen,         SerializerProvider provider) throws IOException,         JsonProcessingException {     jgen.writeStartObject();     jgen.writeNumberField("id", value.id);     jgen.writeNumberField("itemNr", value.itemNr);     jgen.writeNumberField("createdBy", value.user.id);     jgen.writeEndObject();}}我使用Jackson How-to:Custom Serializers中的代码序列化JSON 如何在Jackson中使用自定义Serializer?但我现在需要和杰克逊一起做,因为Gson不支持接口。
查看完整描述

3 回答

?
狐的传说

TA贡献1804条经验 获得超3个赞

如上所述,@ JsonValue是一个好方法。但是如果你不介意自定义序列化程序,则不需要为Item编写一个,而是为User写一个 - 如果是这样,它就像下面这样简单:

public void serialize(Item value, JsonGenerator jgen,
    SerializerProvider provider) throws IOException,
    JsonProcessingException {
  jgen.writeNumber(id);}

另一种可能性是实施JsonSerializable,在这种情况下不需要注册。

至于错误; 这很奇怪 - 你可能想要升级到更高版本。但扩展也更安全,org.codehaus.jackson.map.ser.SerializerBase因为它将具有非必要方法的标准实现(即除了实际的序列化调用之外的所有内容)。


查看完整回答
反对 回复 2019-07-24
  • 3 回答
  • 0 关注
  • 1262 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信