Jackson是Java应用程序中最常用的JSON处理库之一,它能将Java对象转换为JSON格式,也能将JSON反序列化为Java对象。在Spring Boot中,Jackson的使用非常广泛,并且Spring Boot默认配置已经包含了Jackson。本文将详细介绍Jackson在Spring Boot中的多种开发技巧。
1. 依赖引入
在Spring Boot项目中,Jackson通常作为spring-boot-starter-web
的一部分被自动引入。因此,当项目中引入spring-boot-starter-web
后,就不需要单独引入Jackson。不过,如果需要单独引入,可以添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-json</artifactId>
</dependency>
2. 注解使用
Jackson提供了多种注解,用于控制Java对象与JSON对象之间的转换过程。以下是常用的注解及其使用示例:
2.1 @JsonProperty
@JsonProperty
注解用于指定JSON串中的属性名。如果Java对象中的属性名与JSON中的属性名不同,可以使用@JsonProperty
注解进行指定。
public class User {
@JsonProperty("username")
private String name;
private Integer age;
// 省略getter和setter
}
上面的代码表示,在将User对象转换为JSON格式时,name
字段将被序列化成JSON串中的username
属性。
2.2 @JsonIgnore
@JsonIgnore
注解用于忽略某个字段,该字段不会被序列化到JSON中。
public class User {
private String name;
@JsonIgnore
private String password;
// 省略getter和setter
}
上面的代码表示,在将User对象转换为JSON格式时,password
字段将不会出现在JSON中。
2.3 @JsonInclude
@JsonInclude
注解用于指定JSON序列化时包含哪些字段,以及如何处理空值。
@JsonInclude(JsonInclude.Include.NON_NULL)
public class User {
private String name;
private Integer age;
private String phone;
// 省略getter和setter
}
上面的代码表示,在将User对象转换为JSON格式时,如果age
字段的值为null,那么这个字段将不会出现在JSON中。而如果phone
字段的值为null,这个字段将会出现在JSON中,但是它的值将为null。
2.4 @JsonFormat
@JsonFormat
注解用于格式化日期类型字段。
public class User {
private Long id;
@JsonProperty("username")
private String name;
private Integer age;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", locale="zh", timezone="GMT+8")
private Date birthday;
// 省略getter和setter
}
上面的代码表示,在将User对象转换为JSON格式时,birthday
字段将按照指定的日期格式进行序列化。
2.5 @JsonTypeInfo 和 @JsonSubTypes
这两个注解用于处理多态类型的序列化与反序列化。
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.EXISTING_PROPERTY, visible=true, property="type")
@JsonSubTypes({
@JsonSubTypes.Type(value=DncCheckBox.class, name="CHECKBOX"),
@JsonSubTypes.Type(value=DncDate.class, name="DATE"),
// 其他实现类
})
public abstract class DocNoComponent {
public String type;
// 其他属性和方法
}
上面的代码表示,在序列化时,会根据type
字段的值来判断具体的实现类,并在反序列化时根据这个值来实例化对应的类。
3. 全局配置
除了使用注解进行字段级别的配置外,还可以通过Spring Boot的配置文件对Jackson进行全局配置。
3.1 日期格式化
可以在配置文件中指定日期类型的全局格式化规则:
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
3.2 Long型字段转字符串
为了避免JavaScript在处理Long型字段时可能出现的精度丢失问题,可以将Long型字段序列化为字符串:
spring:
jackson:
default-property-inclusion: non_null
serialization:
write_bigdecimal_as_plain: true
或者在字段级别使用@JsonFormat
注解:
public class MyClass {
@JsonFormat(shape=JsonFormat.Shape.STRING)
private Long lng;
// 其他属性和方法
}
4. 自定义序列化与反序列化
如果Jackson提供的注解和全局配置无法满足需求,还可以通过自定义序列化器和反序列化器来实现更复杂的功能。
4.1 自定义序列化器
public class CustomDateSerializer extends JsonSerializer<Date> {
@Override
public void serialize(Date date, JsonGenerator gen, SerializerProvider serializers) throws IOException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formattedDate = sdf.format(date);
gen.writeString(formattedDate);
}
}
然后在Java类中使用@JsonSerialize
注解来指定自定义序列化器:
public class User {
private Long id;
private String name;
@JsonSerialize(using = CustomDateSerializer.class)
private Date birthday;
// 省略getter和setter
}
4.2 自定义反序列化器
public class CustomDateDeserializer extends JsonDeserializer<Date> {
@Override
public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
JsonNode node = p.getCodec().readTree(p);
String date = node.asText();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
return sdf.parse(date);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
}
然后在Java类中使用@JsonDeserialize
注解来指定自定义反序列化器:
public class User {
private Long id;
private String name;
@JsonDeserialize(using = CustomDateDeserializer.class)
private Date birthday;
// 省略getter和setter
}
通过以上介绍,相信你已经对Jackson在Spring Boot中的使用有了更深入的了解。这些技巧将帮助你更好地处理JSON数据的序列化和反序列化,提高开发效率。