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中是不可能的