Jackson如何配置,以在序列化期间忽略某个字段的值,如果该字段的值为null。
例如:
public class SomeClass {
// what jackson annotation causes jackson to skip over this value if it is null but will
// serialize it otherwise
private String someValue;
}
@JsonInclude
注释:mapper.setSerializationInclusion(Include.NON_NULL);
或者:
@JsonInclude(Include.NON_NULL)
class Foo
{
String bar;
}
另外一种方法是在getter中使用@JsonInclude
,这样如果值不为null,则会显示该属性。
更完整的示例可在我的答案和如何通过Jackson防止Map中的null值和bean内的null字段被序列化中找到。
仅为了扩展其他回答 - 如果您需要针对每个字段控制空值的省略,可以注释相关字段(或者注释字段的“getter”)。
示例 - 如果fieldOne
为null,则此处将从JSON中省略它。 fieldTwo
无论是否为null,都将始终包含在JSON中。
public class Foo {
@JsonInclude(JsonInclude.Include.NON_NULL)
private String fieldOne;
private String fieldTwo;
}
为了默认省略类中的所有空值,可以给该类添加注解。如果需要的话,仍然可以使用每个字段/ getter 的注解来覆盖此默认设置。
例如 - 如果 fieldOne
和 fieldTwo
为 null,则它们将分别从 JSON 中省略,因为这是由类注解设置的默认值。但是fieldThree
将始终包括在内,因为它具有字段上的注解,覆盖了默认值。
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Foo {
private String fieldOne;
private String fieldTwo;
@JsonInclude(JsonInclude.Include.ALWAYS)
private String fieldThree;
}
更新
以上适用于Jackson 2。对于早期版本的Jackson,您需要使用:
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
代替
@JsonInclude(JsonInclude.Include.NON_NULL)
如果这个更新有用,请给下面ZiglioUK的答案点赞,它在我更新回答之前就指出了较新的Jackson 2注释!
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
已经被弃用。 - Yar如果使用的是 Jackson > 1.9.11 且 < 2.x 版本,可以使用 @JsonSerialize
注释来实现:
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
@JsonSerialize(using = FooSerializer.class, include = JsonSerialize.Inclusion.NON_NULL)
无效,可为空的值仍然被序列化。 - herau在 Jackson 2.x 中,请使用:
@JsonInclude(JsonInclude.Include.NON_NULL)
com.fasterxml.jackson.annotation
-- Jackson 1.x使用的是org.codehaus.jackson.annoation
。 - StaxMan您可以使用以下映射器配置:
mapper.getSerializationConfig().setSerializationInclusion(Inclusion.NON_NULL);
从2.5版本开始,您可以使用:
mapper.setSerializationInclusion(Include.NON_NULL);
getSerializationConfig()
的文档中写道:请注意,由于实例是不可变的,您无法通过访问实例并调用方法来更改设置:这只会创建配置对象的新实例。 - Zero3mapper.setSerializationInclusion(Include.NON_NULL);
。 - Arturo Volpe您可以设置application.properties
:
spring.jackson.default-property-inclusion=non_null
或 application.yaml
文件:
spring:
jackson:
default-property-inclusion: non_null
http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
就我的情况而言
@JsonInclude(Include.NON_EMPTY)
做到了。
{ }
这样的东西,这毫无意义地将Java习惯用法传递给了消费者。AtomicReference也是一样--消费者并不关心开发人员选择如何强制执行响应的内部表示的线程安全性。 - Lucas Ross@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
Include.NON_EMPTY
表示只有在属性的值不为null且非空时才进行序列化。
Include.NON_NULL
表示只有在属性的值不为null时才进行序列化。
JsonInclude.Include.NON_EMPTY
- 足以涵盖 NOT_NULL 的情况,无需额外处理。 - Ilya BuziukObjectMapper
。application.yml
:spring:
jackson:
default-property-inclusion: non_null # only include props if non-null
always|non_null|non_absent|non_default|non_empty
这是关于如何自定义Jackson ObjectMapper的Spring Boot技巧。这将在Spring Boot 2.0.3+和Jackson 2.0+中起作用。
import com.fasterxml.jackson.annotation.JsonInclude;
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ApiDTO
{
// your class variable and
// methods
}
@JsonInclude(JsonInclude.Include.NON_NULL)
对我在 Spring Boot 2.1.2 和 Jackson Annotations 2.9.0 上也起作用。 - manasouza
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
;不知何故你的注解不可用。 - Emmanuel Touzery@JsonInclude
注解不起作用,但是这个方法非常有效:@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
(我使用的是Jackson 1.9.12和Spring 3.2.2)。 - gstroup@JsonSerialize
语法更改为@JsonInclude
。旧的语法已被弃用。 - Logan Pickup