杰克逊:避免因未建模的田地造成的例外情况

时间:2012-01-17 03:23:22

标签: java json javabeans jackson

我有一些bean,他们模拟(显式)JSon中的核心数据类型。但是,有时Jsons im read在其中有额外的数据。

有没有办法在jackson中注释/定义Bean,以便它为某些字段(例如我知道的字段)使用显式字段名称,同时将额外字段填入地图/列表?

1 个答案:

答案 0 :(得分:10)

是的,假设您确实想要保留所有额外/无法识别的参数,那么请执行以下操作:

public class MyBean {
    private String field1;
    private String field2;
    private Integer field3;
    private Map <String, Object> unknownParameters ;

    public MyBean() {
        super();
        unknownParameters = new HashMap<String, Object>(16);
    }

    // Getters & Setters here

    // Handle unknown deserialization parameters
    @JsonAnySetter
    protected void handleUnknown(String key, Object value) {
        unknownParameters.put(key, value);
    }
}

要配置参数的全局处理,您可以选择定义DeserializationProblemHandler的实现,并使用ObjectMapper配置全局注册。

DeserializationProblemHandler handler = new MyDeserializationProblemHandler();
ObjectMapper.getDeserializationConfig().addHandler(handler);

如果您发现确实关心未知参数,那么您只需关闭它们即可。在每个类的基础上使用@JsonIgnoreProperties(ignoreUnknown = true),或者通过配置ObjectMapper全局:

objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false)