针对特定类别中的特定类型的自定义Jackson Serializer

时间:2014-04-23 18:55:31

标签: java json serialization jackson

Jackson是否允许仅在特定类别中为特定类型自定义序列化?

这是我的情景: 我有ClassA.java,它类似于:

public Class ClassA {

    byte[] token;
    String name;

    public getToken() {
        return token;
    }

    public setToken(byte[] newToken) {
        token = newToken;
    }

    public getName() {
        return name;
    }

    public setName(String newName) {
        name = newName;
    }
}

我无法访问此类,因为它位于外部jar中。但是,我想以特定方式在此处序列化令牌字节数组。我创建了一个自定义序列化程序,并尝试以杰克逊文档中提到的所有方式将其添加到映射器中。

public class ByteArrayJacksonSerializer extends JsonSerializer<byte[]> {

    public void serialize(byte[] value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {

        String token = doMyThing(value);
        jgen.writeString(token);
    }
}

在mapper中,有这样的东西:

public class MyObjectMapper extends ObjectMapper {

    CustomSerializerFactory sf = new CustomSerializerFactory();
    sf.addGenericMapping(byte[].class, new ByteArrayJacksonSerializer());
    this.setSerializerFactory(sf);

    and some more code here...
}

但是我一般只能用于byte [],而不能用于ClassA中的ONLY byte []。有没有办法让杰克逊知道这个自定义序列化器必须只用于ClassA中byte []类型的字段,并且为所有其他类做自己的序列化?

1 个答案:

答案 0 :(得分:6)

您应该使用MixIn功能。在您的示例中,您必须创建新界面:

interface ClassAMixIn {

    @JsonSerialize(using = ByteArrayJacksonSerializer.class)
    byte[] getToken();
}

指定给定属性的自定义序列化程序。现在我们必须配置ObjectMapper

ObjectMapper mapper = new ObjectMapper();
mapper.addMixInAnnotations(ClassA.class, ClassAMixIn.class);

您的自定义序列化程序仅用于序列化ClassA中的字节数组属性。