gpt4 book ai didi

java/jackson - @JsonValue/@JsonCreator 和 null

转载 作者:行者123 更新时间:2023-12-05 05:26:08 35 4
gpt4 key购买 nike

我有一个 Value 类,它包含一个值:

public class Value {
protected final Object value;

@JsonValue
public Object getValue() {
return value;
}

@JsonCreator
public Value(final Object value) {
this.value = value;
}
}

Value 类作为字段(与其他字段一起)嵌入到数据类中:

class Data {
protected final Value value;

@JsonProperty("value")
public Value getValue() {
return value;
}

...

@JsonCreator
public Data(@JsonProperty("value") final Value value, ...) {
this.value = value;
....
}
}

当输入 JSON 的 data 对象的 value 字段为 null 时(参见下面的示例),Data.值 为空。我想将 Data.value 设置为 new Value(null)。换句话说,数据对象必须持有一个非空值对象,该对象持有空值。

{
"value" : null,
...
}

实现此目标的最简单方法是什么?我当然可以更改 Data 的构造函数,但我想知道 Jackson 是否可以自动解决这个问题。

最佳答案

您可以编写自定义反序列化器并根据您的要求覆盖 getNullValue() 方法,例如

public final class InstantiateOnNullDeserializer
extends JsonNodeDeserializer
{
@Override
public JsonNode getNullValue()
{
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.convertValue(new Value(null), JsonNode.class);
return node;
}
}

并将其注册到您的Data 类的值字段

class Data {
@JsonDeserialize(using = InstantiateOnNullDeserializer.class)
protected final Value value;


@JsonProperty("value")
public Value getValue() {
return value;
}



@JsonCreator
public Data(Value value) {
this.value = value;
}
}

请注意,您需要删除 @JsonProperty("value") 以避免参数类型不匹配。通过删除 JsonProperty 注释,您创建了一个所谓的“委托(delegate)创建者”,Jackson 将首先将 JSON 绑定(bind)到参数的类型中,然后调用创建者

关于java/jackson - @JsonValue/@JsonCreator 和 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27920707/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com