我有以下杰克逊课程:
公共类 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
。
知道我该怎么做吗?
备注:
@JsonInclude(JsonInclude.Include.NON_DEFAULT)
注释类,但它没有改变任何东西Integer
而不是 int
,但 Jackson 仍然将其保留为 null
(不分配 -1
),并且我想避免在我这边进行检查,例如value != null ? value : -1
。当然,如果没有解决方案,我会这样做,但我觉得很奇怪,杰克逊无法理解我在问什么,所以我想知道是否是我问错了方式defaultValue
元素仅用于文档目的。没有任何实际作用。
可用于文档属性的预期默认值的属性:最常用作生成模式(如 JSON 模式或 protobuf/thrift 模式)或文档的源信息。 Jackson 扩展模块也可以使用它; core
除了简单地通过 bean 属性自省公开此值之外,没有任何自动处理。jackson-databind
您可以通过覆盖自定义解串器中的
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;
}
}