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

如何在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不支持接口。


ibeautiful
浏览 1263回答 3
3回答

狐的传说

如上所述,@ JsonValue是一个好方法。但是如果你不介意自定义序列化程序,则不需要为Item编写一个,而是为User写一个 - 如果是这样,它就像下面这样简单:public&nbsp;void&nbsp;serialize(Item&nbsp;value,&nbsp;JsonGenerator&nbsp;jgen, &nbsp;&nbsp;&nbsp;&nbsp;SerializerProvider&nbsp;provider)&nbsp;throws&nbsp;IOException, &nbsp;&nbsp;&nbsp;&nbsp;JsonProcessingException&nbsp;{ &nbsp;&nbsp;jgen.writeNumber(id);}另一种可能性是实施JsonSerializable,在这种情况下不需要注册。至于错误;&nbsp;这很奇怪 - 你可能想要升级到更高版本。但扩展也更安全,org.codehaus.jackson.map.ser.SerializerBase因为它将具有非必要方法的标准实现(即除了实际的序列化调用之外的所有内容)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java