【问题标题】:Can I get the equivalent of @JsonAnySetter functionality, outside of the object?我可以在对象之外获得与 @JsonAnySetter 功能等效的功能吗?
【发布时间】:2020-10-05 15:25:38
【问题描述】:

我在一个被 Jackson 反序列化的对象中有这个定义:

public class ImportantInterfaceObject {

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

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

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

但是,这个额外的包袱污染了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);

【问题讨论】:

标签: jackson jackson-databind


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2021-06-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多