Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
没有任何JsonIncludeconfiguration的字段。对,但是无论Java将其初始化为null还是我显式将其设置为null,它都会序列化null字段。我想我需要要么让可选值正常工作,要么拿出不为null的默认值(因为Jackson显然无法区分两者_Java_Json_Jackson - Fatal编程技术网

没有任何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>