java-杰克逊自定义序列化器按字段名称?

我有一个要序列化的POJO,其对象类型为表示形式的对象字段,并且为此编写了一个自定义序列化程序.

POJO:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "user", propOrder = {
    //......
})
public class User {

    protected User.Event userEvent;
    protected Boolean isValid;
    protected Boolean isPrivleged;

    // getter/ setters

     // Inner static class
     public static class Event {

        protected Object representation;
        protected User.Event.Monitor userMonitor;

        // getter setters and Monitor static class

     }
}

现在,由于某种原因,我无法编辑POJO,因此我希望通过ObjectMapper在代码中对Jackson进行所有配置.我无法为字段对象表示形式注册我的自定义序列化程序,因为它处理类型为所有对象的超类的对象.

    public class CustomSerializer extends JsonSerializer<Object>{

        @Override
        public void serialize(Object obj, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {



            jgen.writeObject(content);
            // ...........      
        }

        @Override
        public Class<Object> handledType() {
            return Object.class;
        }

    }

这给出了例外:

java.lang.IllegalArgumentException: JsonSerializer of type CustomSerializer does not define valid handledType() -- must either register with method that takes type argument  or make serializer extend 'com.fasterxml.jackson.databind.ser.std.StdSerializer'
    at com.fasterxml.jackson.databind.module.SimpleSerializers.addSerializer(SimpleSerializers.java:80)
    at com.fasterxml.jackson.databind.module.SimpleModule.addSerializer(SimpleModule.java:240)

因此,我想既然每个字段都具有超类Object,因此它表示无效的handleType().

有没有办法通过文件名或其他方式以编程方式注册序列化器.例如,当字段名称为表示形式时,为其注册我的序列化程序?

如何处理以上情况?

解决方法:

您是否曾经考虑过Jackson混合注解?

杰克逊混入注解

当不能选择修改类时,这是一个很好的选择.您可以将其视为一种面向方面的方式,在运行时添加更多注释,以增强静态定义的注释.

定义一个混合注释接口(类也可以):

public interface EventMixIn {

    @JsonProperty("representation")
    @JsonSerialize(using = CustomSerializer.class)
    Object getRepresentation();
}

然后配置ObjectMapper以使用定义的接口作为POJO的混合:

ObjectMapper mapper = new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT)
                                        .addMixIn(User.Event.class, EventMixIn.class); 

使用注意事项

以下是一些使用注意事项:

>可以混入Jackson识别的所有注释集.
>可以混入各种注释(成员方法,静态方法,字段,构造函数注释).
>仅方法(和字段)名称和签名用于匹配注释:访问定义(私有,受保护的…)和方法实现将被忽略.

有关更多详细信息,请查看此page.

上一篇:java-将json转换为对象列表


下一篇:java-是否可以获取@JsonProperty的原始字段名称?