在Jackson Databind中,已弃用属性SerializationFeature.WRITE_NULL_MAP_VALUES有替代方案吗?

6
我们正在项目中使用ObjectMapper来忽略空映射的序列化。
configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false)

但是在Jackson-Databind 2.9之后,该属性被弃用,我们正在寻找替代选项。

下面的代码是否可以作为删除上述属性的替代品 -

setSerializationInclusion(Include.NON_NULL)
1个回答

9

来自文档

已弃用。自2.9版本以来,有更好的机制来指定过滤器;具体来说是使用JsonInclude或配置覆盖(请参见ObjectMapper.configOverride(Class))。该特性确定是否序列化具有空值的Map条目(true)或不序列化(false)。
注意:与其他SerializationFeatures不同,此功能不能在每次调用时动态更改,因为其效果在序列化程序和属性处理程序构建期间被考虑。

该特性默认启用。

简单示例:

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Value;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

import java.util.HashMap;
import java.util.Map;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        Map<String, Object> map = new HashMap<>();
        map.put("string", "value");
        map.put("int", 1);
        map.put("null1", null);
        map.put(null, null);

        ObjectMapper mapper = new ObjectMapper();
        mapper.enable(SerializationFeature.INDENT_OUTPUT);
        mapper.configOverride(Map.class).setInclude(Value.construct(JsonInclude.Include.NON_NULL, JsonInclude.Include.NON_NULL));

        System.out.println(mapper.writeValueAsString(map));
    }
}

以上代码输出:
{
  "string" : "value",
  "int" : 1
}

1
我看到这个更改起作用了,但我真的不理解为什么要弃用。有人能给出一个更明确/有用的弃用描述吗? - Bill Naylor
1
不得不承认,我也觉得 setInclude 的 javadocs 很难懂。 - Bill Naylor
@BillNaylor,添加note应该会给你更好的理由:与其他SerializationFeatures不同,此功能不能在每个调用基础上动态更改,因为其效果在序列化程序和属性处理程序的构建期间被考虑。 - Michał Ziober

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接