我可以在对象之外获得@JsonAnySetter功能吗?

问题描述

我在杰克逊反序列化的对象中有这个定义:

public class ImportantInterfaceObject {

    @JsonAnySetter
    private Map<String,String> unmapped = new HashMap<String,String>();

    // ... other stuff omitted for clarity ...
}

这非常有用,它允许unmapped成员捕获要根据要求和最佳实践进行处理的输入中的任何意外值。

但是,这会给这个额外的包poll污染ImportantInterfaceObject定义。

是否有一种方法可以达到与@JsonAnySetter相同的效果,但是在Jackson对象生命周期的另一个层次上呢?

例如,

ObjectMapper objectMapper = new ObjectMapper();

// pseudo-code,this doesn't exist
objectMapper.setAnyHandler((key,value) -> doSomething(...));

// back to normal valid code Now
JsonNode json = objectMapper.readTree(input);

解决方法

如果您只想忽略未映射的属性,则可以执行以下操作:

ObjectMapper om = new ObjectMapper();
om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);

但是我想您想对未知属性启用一些处理,但同时又将其隐藏在类的实际逻辑中。

在这种情况下,您可以只使用继承,而不必使用Map创建使用@JsonAnySetter批注的方法,例如:

public class UnmappedPropertyHandler {
    @JsonAnySetter
    private void handleUnmapped(String name,String value) {
        // do what you need
    }
}

public class ImportantInterfaceObject extends UnmappedPropertyHandler {
    // ... any actually mapped stuff
}

您还可以声明接口,但是如果使用Java8,则无法隐藏该方法:

interface IUnmappedPropertyHandler {
    @JsonAnySetter
    default void handleUnmapped(String name,String value) {
    }
}

对于Java11,可能是这样的,

interface IUnmappedPropertyHandler {
    @JsonAnySetter
    private void handleUnmapped(String name,String value) {
    }
}