【问题标题】:Custom Jackson Serializer for a specific type in a particular class特定类中特定类型的自定义杰克逊序列化器
【发布时间】:2014-06-08 19:04:50
【问题描述】:

有没有办法让 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 中。但是,我想在此处以特定方式序列化 token 字节数组。我创建了一个自定义序列化程序来执行此操作,并尝试以杰克逊文档中提到的所有方式将其添加到映射器中。

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);
    }
}

而在映射器中,是这样的:

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[] 执行此操作。有没有办法让 Jackson 知道这个自定义序列化程序必须仅用于 ClassA 中的 byte[] 类型的字段,并且以自己的方式对所有其他类进行序列化?

【问题讨论】:

    标签: java json serialization jackson


    【解决方案1】:

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

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

    为给定属性指定自定义序列化程序。现在我们要配置ObjectMapper

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

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

    【讨论】:

      猜你喜欢
      • 2011-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-11
      • 2014-01-31
      • 1970-01-01
      • 1970-01-01
      • 2015-03-12
      相关资源
      最近更新 更多