Java 在jackson中反序列化可选的可空字段

Java 在jackson中反序列化可选的可空字段,java,json,jackson,Java,Json,Jackson,我有一个Employee类,我想像这样序列化它: class Employee { String name; @JsonUnwrapped EmployeeId id; @JsonUnwrapped(prefix = "previousEmployee") EmployeeId previousEmployeeId; } final class EmployeeId{ @JsonProperty("id") private final long value; @J

我有一个
Employee
类,我想像这样序列化它:

class Employee {
  String name;
  @JsonUnwrapped
  EmployeeId id; 
  @JsonUnwrapped(prefix = "previousEmployee")
  EmployeeId previousEmployeeId;
}

final class EmployeeId{
 @JsonProperty("id")
 private final long value;

 @JsonCreator
 public EmployeeId(@JsonProperty("id") long value) {
    this.value = value;
 }
}
序列化
Employee
会产生以下json:

{
  "name":"foo",
  "id" : 123,
  "previousEmployeeid" : 456
}
但是,
previousEmployeeId
是可选的。因此,如果我尝试反序列化这个json,它会将
id
放入
previousEmployeeId
字段。我做错了什么

{
  "name":"foo",
  "id" : 123
}
我希望字段
previousEmployeeid
null
,但它被分配了一个值
123

等等

final class EmployeeId {
    @JsonProperty("id")
    private final long value;

    @JsonCreator
    public EmployeeId(@JsonProperty("whatever") long value) {
        this.value = value;
    }
}
无论什么
作为
@JsonProperty
值查看。您可以输入任何不是空的,但不是
id的
顺便说一句,这一定是某种错误


请记住,它不能为
null
,因为内部
是基本类型。而且包装器对象无论如何也不会为null


JsonCreator
JsonUnwrapped
一起使用,您不能拥有
null
EmployeeId


我总是测试我的代码。它起作用了

final class EmployeeId {
    @JsonProperty("id")
    private final long value;

    @JsonCreator
    public EmployeeId(@JsonProperty("whatever") long value) {
        this.value = value;
    }
}
无论什么
作为
@JsonProperty
值查看。您可以输入任何不是空的,但不是
id的
顺便说一句,这一定是某种错误


请记住,它不能为
null
,因为内部
是基本类型。而且包装器对象无论如何也不会为null


JsonCreator
JsonUnwrapped
一起使用,您不能拥有
null
EmployeeId


我总是测试我的代码。它起作用了


这很棘手。我把它标在书签上了这很棘手。我将其设置为书签,将其更改为任何值,它现在将传递value=0。我希望
previousEmployeeId
为空,但它现在的值为EmployeeId(0)。@user311525您不能有空的EmployeeId。为此,您需要定制JsonNodeDeserializer@user3111525这是JsonCreator的合同。Jackson作为构造函数为您提供可能为空的值parameter@user3111525,
id
类型为
long
。如果需要
null
,则需要将类型更改为
Long
。不能将
null
赋值给基元类型。@MichałZiober Yes。但是他想要一个空的包装器对象(EmployeeId),但是这在JsonCreator+JSONUnwrapped中是不可能的。如果将它更改为任何值,它现在就可以传递value=0。我希望
previousEmployeeId
为空,但它现在的值为EmployeeId(0)。@user311525您不能有空的EmployeeId。为此,您需要定制JsonNodeDeserializer@user3111525这是JsonCreator的合同。Jackson作为构造函数为您提供可能为空的值parameter@user3111525,
id
类型为
long
。如果需要
null
,则需要将类型更改为
Long
。不能将
null
赋值给基元类型。@MichałZiober Yes。但他想要一个空包装器对象(EmployeeId),但这在JsonCreator+JsonUnwrapped中是不可能的