序列化
更改字段名(别名)
使用 @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