当前位置: 首页 > 知识库问答 >
问题:

为什么Jackson NON_NULL不能使用可选的?

戚令秋
2023-03-14

为了区分(a)任何值、(b)显式null和(c)无值的情况,我使用java.util.optionalnon_null注释。

public interface MyProjection {

    @JsonInclude(Include.NON_NULL)
    Optional<String> getMyAttribute();
}

这在Spring Boot 2.1.0/Jackson 2.9.7中非常适用。

目前(更新后)null似乎像optional.empty()一样处理。它呈现{“myattribute”:null},尽管该字段是用@jsoninclude(NON_NULL)注释的。在Spring Boot 2.5.5/Jackson 2.12.5中,它呈现:

共有1个答案

范朗
2023-03-14

经过几次搜索,我找到了感兴趣的测试用例。

以下是jackson Projects中带有可选选项的测试用例摘录:

public void testConfigAbsentsAsNullsTrue() throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new Jdk8Module().configureAbsentsAsNulls(true));

        OptionalData data = new OptionalData();
        String value = mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL).writeValueAsString(data);
        assertEquals("{}", value);
    }

    public void testConfigAbsentsAsNullsFalse() throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new Jdk8Module().configureAbsentsAsNulls(false));

        OptionalData data = new OptionalData();
        String value = mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL).writeValueAsString(data);
        assertEquals("{\"myString\":null}", value);
    }

    class OptionalData {
        public Optional<String> myString = Optional.empty();
    }

还有一个注释ConfigureAbsentSasNulls。https://github.com/fasterxml/jackson-datatype-jdk8/blob/master/src/main/java/com/fasterxml/jackson/datatype/jdk8/jdk8module.java

For compatibility with older versions
     * of other "optional" values (like Guava optionals), it can be set to 'true'. The
     * default is `false` for backwards compatibility. 
public Jdk8Module configureAbsentsAsNulls(boolean state) {
    _cfgHandleAbsentAsNull = state;
    return this;
}
 类似资料:
  • 当使用Java8类时,有两种方法可以将值包装到Optional中。 我理解是使用的唯一安全方法,但为什么?为什么不直接使用

  • 我在许多网站上读到可选的应该只作为返回类型使用,而不是在方法参数中使用。我很难找到一个合乎逻辑的原因。例如,我有一个逻辑,它有两个可选参数。因此,我认为这样写我的方法签名是有意义的(解决方案1): 许多网页指定可选的不应用作方法参数。考虑到这一点,我可以使用下面的方法签名并添加一个清晰的Javadoc注释来指定参数可能是空的,希望将来的维护者会读取Javadoc并因此在使用参数之前总是执行空检查(

  • 我读了很多关于应该使用的案例。 我读过的许多页面都说不应该用于私有实例变量,而应该由getters返回。 我认为将私有实例变量作为可选变量仍然是有用的。如果有人查看我的代码,他们可以看到一个值可以是空的,而不必检查留档是否可以返回空。 在Scala中,null从未使用过,它只是用于与Java的互操作性。如果值可以为null,建议始终使用可选值。这种方法对我来说更有意义。 这里有一页提到了它: ht

  • 如果我有一个模型序列化程序,其中数据库模型中不需要first_name和last_name(blank=True,null=True,default=None),并且我选择提交可能包含或可能不包含“first_name”或“last_name”字段的json数据,那么无论这些字段是否通过json请求提交,这些字段不应该存在于已验证的_数据[]中,因为它们列在序列化程序字段中,并且其默认值设置为无?

  • 问题内容: 苹果的新框架似乎使用了一种 新型语法 ,可以有效地构建元组,但又具有另一种语法: 尝试解决这种语法的实际含义时 ,我发现这里使用的初始化程序将类型的闭包 作为第二个参数,其中的通用参数是通过闭包推断的。为了找出要推断的类型,我对代码进行了一些更改,并保持其功能: 以此,表明自己是类型,即类型。向上看,我发现它是一个源自自身的包装器类型,只能通过传递应该包装的元组来进行初始化。 题 现在

  • 问题内容: 我有以下查询: 当我这样做时,第一行显示的内容包括: 为什么键为NULL? 问题答案: 可能是因为统计信息已损坏,或者是因为它知道两个表之间始终具有1:1的比率。 您可以强制在查询中使用索引,并查看这样做是否可以加快速度。如果是这样,请尝试运行ANALYZE TABLE以确保统计信息是最新的。 通过指定USE INDEX(index_list),可以告诉MySQL仅使用命名索引之一来查