Jackson 序列化 - 忽略未设置的值但提供明确设置为 null 的值
Jackson serialization - ignore not set values but provide values explicitly set to null
在我的 Spring Boot REST 应用程序中,我确实希望实现 class 的属性在未明确设置时应被 Jackson 忽略。但是,如果将它们设置为 null
,则应提供并序列化它们。
@JsonInclude(Include.NON_NULL)
忽略 null
值,但在实际未设置的值和已明确设置为 null
.
的值之间没有区别
检查以下示例(使用 Lombok),它显示了我在这里想要实现的目标:
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
@Getter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Example {
@JsonProperty("name")
private String name;
@JsonProperty("test")
private String test;
}
Example.builder().test("test").build()
应该导致 {test: "test"}
Example.builder().name(null).test("test).build()
应该导致 {name: NULL, test: "test"}
实现该目标的最佳方法是什么?
在Java中,您的属性在未设置时将为空。因此,除非您添加某种标志以了解实际设置属性的时间(甚至设置为 null),否则您无法实现您想要的。也就是说,未设置的属性和设置为空的属性之间没有区别。如果您确实添加了一个 "isSet" 标志(可能是一个映射,因为它的标志是每个属性),那么您可能需要一个自定义 Jackson 映射器来读取 "isSet" 标志并相应地执行操作。
这可以使用 Optional
个字段来实现:
public class JsonTest {
@JsonInclude(JsonInclude.Include.NON_NULL)
@Getter
@AllArgsConstructor
@NoArgsConstructor
@Builder
static class Example {
private Optional<String> name;
private Optional<String> test;
}
public static void main(String[] args) throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper().registerModule(new Jdk8Module());
Example[] examples = {
new Example(),
Example.builder().name(Optional.of("exampleName")).build(),
Example.builder().name(Optional.of("exampleName")).test(Optional.empty()).build(),
};
for (Example ex : examples) {
System.out.println(mapper.writeValueAsString(ex));
}
}
}
输出:
{}
{"name":"exampleName"}
{"name":"exampleName","test":null}
在我的 Spring Boot REST 应用程序中,我确实希望实现 class 的属性在未明确设置时应被 Jackson 忽略。但是,如果将它们设置为 null
,则应提供并序列化它们。
@JsonInclude(Include.NON_NULL)
忽略 null
值,但在实际未设置的值和已明确设置为 null
.
检查以下示例(使用 Lombok),它显示了我在这里想要实现的目标:
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
@Getter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Example {
@JsonProperty("name")
private String name;
@JsonProperty("test")
private String test;
}
Example.builder().test("test").build()
应该导致 {test: "test"}
Example.builder().name(null).test("test).build()
应该导致 {name: NULL, test: "test"}
实现该目标的最佳方法是什么?
在Java中,您的属性在未设置时将为空。因此,除非您添加某种标志以了解实际设置属性的时间(甚至设置为 null),否则您无法实现您想要的。也就是说,未设置的属性和设置为空的属性之间没有区别。如果您确实添加了一个 "isSet" 标志(可能是一个映射,因为它的标志是每个属性),那么您可能需要一个自定义 Jackson 映射器来读取 "isSet" 标志并相应地执行操作。
这可以使用 Optional
个字段来实现:
public class JsonTest {
@JsonInclude(JsonInclude.Include.NON_NULL)
@Getter
@AllArgsConstructor
@NoArgsConstructor
@Builder
static class Example {
private Optional<String> name;
private Optional<String> test;
}
public static void main(String[] args) throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper().registerModule(new Jdk8Module());
Example[] examples = {
new Example(),
Example.builder().name(Optional.of("exampleName")).build(),
Example.builder().name(Optional.of("exampleName")).test(Optional.empty()).build(),
};
for (Example ex : examples) {
System.out.println(mapper.writeValueAsString(ex));
}
}
}
输出:
{}
{"name":"exampleName"}
{"name":"exampleName","test":null}