Jackson注解使用

Jackson注解使用

Posted by yishuifengxiao on 2019-07-30

1 @JsonProperty

标记注释可用于将非静态方法定义为逻辑属性(取决于其签名)的“setter”或“getter”,或者将要使用(序列化,反序列化)的非静态对象字段定义为逻辑属性。

默认值(“”)表示字段名称用作属性名称而不进行任何修改,但可以将其指定为非空值以指定其他名称。 属性名称是指外部使用的名称,是 JSON 对象中的字段名称。

从 Jackson 2.6 开始,这个注释也可以用来改变 Enum 的序列化,如下所示:

1
2
3
4
public enum MyEnum {
@JsonProperty(“theFirstValue”)THE_FIRST_VALUE,
@JsonProperty(“another_value”)ANOTHER_VALUE;
}

作为使用 JsonValue 注释的替代方法。

@JsonPropertyaccess属性可以用于更改访问者(getter,field-as-getter)和 mutators(contructor 参数,setter,field-as-setter)的可见性的可选属性,以便其他可见的访问者(如私有的 getter) 可能用过了; 或者忽略其他可见的访问者。

默认值 Access.AUTO,这意味着根据可见性和其他注释确定访问权限。

一般用来 不序列化某些字段,例如不序列化密码

1
2
@JsonProperty(access = com.fasterxml.jackson.annotation.JsonProperty.Access.WRITE_ONLY)
private String pwd;

2 忽略 NULL 的属性

@JsonInclude: 实体类/属性使用的注解,用于忽略 NULL 的属性,空的属性或者 NULL 的类。

有些值为 NULL 不想传过去,往往还得在 SQL 或者代码做循环判断,损耗性能

1
@JsonInclude(Include.NON_NULL),为null的字段将不显示。

3 Java8 日期时间类支持

Java8 增加了一套全新的日期时间类,Jackson 对此也有支持。这些支持是以 Jackson 模块形式提供的,所以首先就是注册这些模块。

1
2
3
4
5
6
ObjectMapper mapper = new ObjectMapper()
.registerModule(new JavaTimeModule())
.registerModule(new ParameterNamesModule())
.registerModule(new Jdk8Module());
# 自动搜索所有模块
mapper.findAndRegisterModules();

也可以用过指定序列化器和反序列化器的方式支持。

有时候在使用 LocaleDateTime 字段后,经过 Jackson 时,可以在 LocaleDateTime 字段上增加以下注释

1
2
3
4
   @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
private LocalDateTime createTime;

4 指定属性格式化日期/时间

1
2
3
4
   @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
private LocalDateTime createTime;

5 忽略属性

User 实体中会有字段 password 字段,当返回用户信息给前台的时候,当然是不希望将 password 值也一并返回,

所以,可以在 password 属性上加上注解 JsonIgnore

或者,可以在 User 类上加上注解 @JsonIgnoreProperties(value = "{password}")

都可以在 json 序列化时将 java bean 中的一些属性忽略掉,序列化和反序列化都受影响。