如何使用 Jackson 识别未声明的原语?

问题描述 投票:0回答:1

我有以下杰克逊课程:

公共类 InspectArrayFormulaArgs {

private final int expectedColumns;

@JsonCreator
public InspectArrayFormulaArgs(@JsonProperty(value = "expectedColumns", defaultValue = "-1") int expectedColumns) {
    this.expectedColumns = expectedColumns;
}

}

我希望 Jackson 检查解析后的 Json 是否包含字段

expectedColumns
,以及:

  • 如果该字段存在,则按原样使用
  • 否则,使用我声明的
    defaultValue

但是,当解析这个pojo时,Jackson解析出的值仍然是

0

我认为这可能是由于 JDK 将

int
初始化为 0,而 Jackson 不明白该字段不在 Json 中(尽管我认为他们直接解析 Json)。

所以我尝试使用

Integer
而不是
int
作为构造函数的参数,但这最终会变成
NullPointerException
,因为 Jackson 没有分配值
-1
,因此 JDK 会尝试拆箱
null
进入田地
int expectedColumns

知道我该怎么做吗?

备注:

  1. 我尝试用
    @JsonInclude(JsonInclude.Include.NON_DEFAULT)
    注释类,但它没有改变任何东西
  2. 我假设我可以将该字段声明为
    Integer
    而不是
    int
    ,但 Jackson 仍然将其保留为
    null
    (不分配
    -1
    ),并且我想避免在我这边进行检查,例如
    value != null ? value : -1
    。当然,如果没有解决方案,我会这样做,但我觉得很奇怪,杰克逊无法理解我在问什么,所以我想知道是否是我问错了方式
java json jackson
1个回答
0
投票

defaultValue
元素仅用于文档目的。没有任何实际作用。

可用于文档属性的预期默认值的属性:最常用作生成模式(如 JSON 模式或 protobuf/thrift 模式)或文档的源信息。 Jackson 扩展模块也可以使用它; core

jackson-databind
除了简单地通过 bean 属性自省公开此值之外,没有任何自动处理。

您可以通过覆盖自定义解串器中的

getNullValue
来提供不同的默认值。

@JsonCreator
public InspectArrayFormulaArgs(
        @JsonDeserialize(using = DefaultMinusOneDeserializer.class)
        @JsonProperty(value = "expectedColumns", defaultValue = "-1")
        int expectedColumns
) {
    this.expectedColumns = expectedColumns;
}

static class DefaultMinusOneDeserializer extends JsonDeserializer<Integer> {
    @Override
    public Integer deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
        return jsonParser.getIntValue();
    }

    @Override
    public Integer getNullValue(DeserializationContext ctxt) {
        return -1;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.