0%

Jackson 注解示例

序列化

更改字段名(别名)

使用 @JsonProperty 注解指定字段别名,序列化、反序列化同等有效:

1
2
3
4
5
6
7
8
public class MyDto {

@JsonProperty("string_value")
private String stringValue;

private int intValue;
private boolean booleanValue;
}

序列化忽略指定字段

类级别

可以通过在类上使用 @JsonIgnoreProperties 以及字段名:

1
2
3
4
5
6
7
@JsonIgnoreProperties(value = { "intValue" })
public class MyDto {

private String stringValue;
private int intValue;
private boolean booleanValue;
}

字段级别

还可以通过在字段上使用 @JsonIgnore

1
2
3
4
5
6
7
public class MyDto {

private String stringValue;

@JsonIgnore
private int intValue;
private boolean booleanValue;

序列化忽略 Null 值的字段

可以使用 @JsonInclude(Include.NON_NULL) 注解定义在类级别和字段级别:

1
2
3
4
5
6
7
8
9
10
11
12
@JsonInclude(Include.NON_NULL)
public class MyDto {
...
}

public class MyDto {

@JsonInclude(Include.NON_NULL)
private String stringValue;

private int intValue;
}

全局忽略 Null 值

1
2
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(Include.NON_NULL);

定义 Json 序列化后的字段顺序

可以通过 @JsonPropertyOrder 注解指定序列化后字段的顺序:

1
2
3
4
5
6
7
8
9
10
11
@JsonPropertyOrder({ "name", "id" })
public class MyBean {
public int id;
public String name;
}

// 输出:
{
"name":"My bean",
"id":1
}

序列化内嵌 Json 数据

默认情况下,如果某个字段值是 Json 字符串(内嵌),Json 字段的值会当成字符串处理被转义,使用 @JsonRawValue 可以将原始 Json 输出,成为内嵌 Json:

1
2
3
4
5
6
7
8
9
10
public class RawBean {
public String name;

@JsonRawValue
public String json;
}

RawBean bean = new RawBean("My bean", "{\"attr\":false}");

String result = new ObjectMapper().writeValueAsString(bean);

自定义 Json 序列化格式以及行为

默认情况下,日期时间类型(Date、Time)的 Json 序列化输出不够友好。可使用 @JsonFormat 自定义序列化的格式:

1
2
3
4
5
6
7
public class MyDto {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private DateTime d;
}

// 输出:
{"d":"2021-03-18 03:33:48"}

针对 JDK8 LocalDateTime 类型,还需要使用 @JsonSerialize@JsonDeserialize 注解进行转换:

1
2
3
4
5
6
7
8
9
public class MyDto {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
public LocalDateTime ldt;
}

// 输出:
{"ldt":"2021-03-18 11:36:07"}

扁平化字段

使用 @JsonUnwrapped 可对字段值进行扁平化处理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class UnwrappedUser {
public int id;

@JsonUnwrapped
public Name name;

public static class Name {
public String firstName;
public String lastName;
}
}

// 输出:
{
"id":1,
"firstName":"John",
"lastName":"Doe"
}

反序列化

反序列化忽略未知字段

默认情况下,当 JSON 字符串包含未知字段时,反序列化会抛出 UnrecognizedPropertyException 异常。

可以通过 .configure() 方法配置行为:

1
ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)

或通过类级别的注解 @JsonIgnoreProperties 配置:

1
2
3
4
@JsonIgnoreProperties(ignoreUnknown = true)
public class MyDto {
...
}

对于不完整的 json,Jackson 反序列化时会自动处理,并将字段赋值为 NULL