所有字段的自定义或动态@JsonProperty,无需使用 Jackson 进行注释

Custom or dynamic @JsonProperty for all fields without annotation with Jackson

我正在寻找一种方法来为 jackson 自定义序列化密钥和反序列化 setter 调用。我有几百个对象,它们都以某种方式与各种级别的抽象和接口相关,但是它们没有很多继承字段。我正在使用适用于我所有 类 的 mixin 来利用过滤器和 TypeIdResolver。我想要序列化为 json 的所有字段都以 'attribute' 结尾,但我不想在 json 中的每个键之后添加属性。我无法重构字段和方法名称,因为它用于遗留 XML 解析,我无法破坏它。我真的不想将@JsonProperty 添加到每个字段;我正在寻找更有活力的东西。一些检查要序列化的字段或要反序列化的键并根据我的喜好修改它的方法。

对于反序列化,我想我可以使用 InjectibleValues,但我还没有尝试过,因为我找不到任何东西来自定义输出键。

例如,

String nameAttribute = "xyz";
getNameAttribute()

"name"="xyz"

没有

"nameAttribute"="xyz"

我能够使用 JacksonAnnotationIntrospector 的自定义扩展来解决这个问题。我覆盖了寻找 @JsonProperty 的方法并提供了我自己的逻辑。我还必须实现自己的 hasIgnoreMarker() 以避免将 @JsonIgnore 到处都是,因为在实际序列化之前不会发生过滤,所以我收到有关重复 getter 和 setter 的错误。

mapper.setAnnotationIntrospector(new MyAnnotationIntrospector());



private static class MyAnnotationIntrospector extends JacksonAnnotationIntrospector {

    
    @Override
    public PropertyName findNameForSerialization(Annotated a) {
        if (a instanceof AnnotatedField) {
            String name = a.getName();
            if (name.endsWith("Attribute")) {
                return PropertyName.construct(name.replace("Attribute", ""));
            }
        }
        return super.findNameForSerialization(a);
    }

    @Override
    public PropertyName findNameForDeserialization(Annotated a) {
        if (a instanceof AnnotatedField) {
            String name = a.getName();
            if (name.endsWith("Attribute")) {
                return PropertyName.construct(name.replace("Attribute", ""));
            }
        }
        return super.findNameForDeserialization(a);
    }