没有任何JsonIncludeconfiguration的字段。对,但是无论Java将其初始化为null还是我显式将其设置为null,它都会序列化null字段。我想我需要要么让可选值正常工作,要么拿出不为null的默认值(因为Jackson显然无法区分两者
没有任何JsonIncludeconfiguration的字段。对,但是无论Java将其初始化为null还是我显式将其设置为null,它都会序列化null字段。我想我需要要么让可选值正常工作,要么拿出不为null的默认值(因为Jackson显然无法区分两者,java,json,jackson,Java,Json,Jackson,没有任何JsonIncludeconfiguration的字段。对,但是无论Java将其初始化为null还是我显式将其设置为null,它都会序列化null字段。我想我需要要么让可选值正常工作,要么拿出不为null的默认值(因为Jackson显然无法区分两者之间的区别)。问题是对于原语,null、0和非零都是有效值,所以我不知道默认值应该使用什么。在这种情况下,请看答案。另外,我不建议在被反序列化的类中使用原语,因为它会抛出一个NPEis对应值,在json中为null。我实际上正在尝试进行部分更新
没有任何
JsonInclude
configuration的字段。对,但是无论Java将其初始化为null还是我显式将其设置为null,它都会序列化null字段。我想我需要要么让可选值正常工作,要么拿出不为null的默认值(因为Jackson显然无法区分两者之间的区别)。问题是对于原语,null、0和非零都是有效值,所以我不知道默认值应该使用什么。在这种情况下,请看答案。另外,我不建议在被反序列化的类中使用原语,因为它会抛出一个NPE
is对应值,在json中为null
。我实际上正在尝试进行部分更新。感谢您的回答,我将寻找一种不同的方法。使用2.9.6版本测试,仅使用jdk8模块,可选的工作方式与预期一致。不需要参数名模块
class Data {
public String string;
public String other;
}
Data data = new Data();
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writeValueAsString(data));
{"string":null,"other":null}
Data data = new Data("value", null);
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writeValueAsString(data));
{"string":"value"}
@JsonInclude(Include.NON_NULL)
class IgnoreNullFields
{
String someString;
}
// object Mapper
ObjectMapper mapper = new ObjectMapper()
.registerModule(new Jdk8Module())
.registerModule(new ParameterNamesModule())
.registerModule(new JavaTimeModule());
// DTO
@Data
@ToString
@JsonInclude(JsonInclude.Include.NON_NULL)
// employee object in producer
public class PEmployee {
private Optional<String> name;
private Optional<Integer> age;
private Optional<BigDecimal> salary;
private Optional<Boolean> active;
private Optional<LocalDate> dateOfJoining;
}
// serialize before sending it
PEmployee emp = new PEmployee();
emp.setActive(Optional.ofNullable(Boolean.FALSE));
emp.setName(Optional.of("Johnson"));
emp.setDateOfJoining(Optional.empty());
// PEmployee(name=Optional[Johnson], age=null,
//salary=null, active=Optional[false], dateOfJoining=Optional.empty)
String payload = mapper.writeValueAsString(emp);
// {"name":"Johnson","active":false,"dateOfJoining":null}
// DTO
@Data
@ToString
public class CEmployee {
private Optional<String> name;
private Optional<Integer> age;
private Optional<BigDecimal> salary;
private Optional<Boolean> active;
private Optional<LocalDate> dateOfJoining;
}
// deserialize
CEmployee emp = mapper.readValue(payload, CEmployee.class);
// CEmployee(name=Optional[Johnson], age=null,
// salary=null, active=Optional[false], dateOfJoining=Optional.empty)
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-parameter-names</artifactId>
<version>2.8.10</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jdk8</artifactId>
<version>2.8.10</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.8.10</version>
</dependency>