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);
}