java/jackson-@JsonValue/@JsonCreator和null
我有一个java/jackson-@JsonValue/@JsonCreator和null,java,json,null,jackson,wrapper,Java,Json,Null,Jackson,Wrapper,我有一个Value类,它包含一个值: public class Value { protected final Object value; @JsonValue public Object getValue() { return value; } @JsonCreator public Value(final Object value) { this.value = value; } } 该值类作为字段
Value
类,它包含一个值:
public class Value {
protected final Object value;
@JsonValue
public Object getValue() {
return value;
}
@JsonCreator
public Value(final Object value) {
this.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.value
为null。我想将Data.value
设置为新值(null)
。换句话说,数据对象必须持有非空值对象,该对象持有空值
{
"value" : null,
...
}
最简单的方法是什么?当然,我可以更改
数据的构造函数,但我想知道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;
}
}
并将其注册到数据类的值字段中
请注意,您需要删除@JsonProperty(“value”)
以避免参数类型不匹配。通过删除JsonProperty注释,可以创建所谓的“委托创建者”,
Jackson将首先将JSON绑定到参数类型中,然后调用创建者,我认为不创建自己的反序列化程序或修改构造函数(或@JsonCreator
),这是不可能的
发件人:
@JsonProperty
不支持转换,因为数据绑定基于增量解析,无法访问完整的树表示
因此,为了避免使用自定义反序列化程序,我将采取以下措施:
@JsonCreator
public Data(@JsonProperty("value") final String value) {
this.value = new Value(value);
}
这与你的要求正好相反;) 谢谢。我将编写一个自定义反序列化程序。这也适用于ctr吗<代码>公共数据(@JsonProperty(“value”)@JsonDeserialize(using=instantiationonnulldeserializer.class)value值){…}
并从getter中删除@JsonDeserialize
注释。对我来说,将反序列化程序与ctr/@JsonCreator
链接更有意义。事实上,它应该在字段中,在答案中编辑。我认为反序列化器只有在设置为field或accessor方法时才会应用。记住从构造函数中删除@JsonProperty
@JsonCreator
public Data(@JsonProperty("value") final String value) {
this.value = new Value(value);
}