首页 > 解决方案 > 用于 Map 的 Jackson 自定义 KeyDeserializer,不包括 key 为 null 的条目

问题描述

我的 POJO 中的自定义密钥反序列化器如下:

@JsonDeserialize(keyUsing = MyCustomKeyDeserializer.class)
@JsonInclude
private Map<T, @Range(min = 0, max = 100) Integer> ratios;

但是,我有一种情况,以前有效的密钥不再有效,并且希望提供向后兼容性。

例如,如果代码用于接受键AGE并且HEIGHT想开始排除HEIGHT,则 JSON 对象{"AGE": 30, "HEIGHT": 60}将被反序列化为仅{"AGE": 30}在映射中

我试图解决它的方法是从类中返回一个null值。MyCustomKeyDeserializer但是,地图现在以包含null作为键之一的条目结束。有没有办法从地图中排除空键?或者提供这种行为的不同方法?

序列化程序的代码如下:

public class MyCustomKeyDeserializer extends KeyDeserializer {

    private Map<String, Object> registry;

    @Override
    public Object deserializeKey(final String key, final DeserializationContext ctxt) 
       throws IOException {
        return registry.get(key);
    }
}

标签: javajsonjackson

解决方案


如果您知道键名是什么,则可以使用com.fasterxml.jackson.annotation.JsonIgnoreProperties注释:

@JsonIgnoreProperties(value = {"HEIGHT"})
@JsonDeserialize(keyUsing = MyCustomKeyDeserializer.class)
private Map<T, @Range(min = 0, max = 100) Integer> ratios;

推荐阅读