SpringBoot使用Jackson
概述:
Springboot配置JackSon处理类属性,JavaBean序列化为JSON格式,常用框架:阿里fastjson,谷歌gson、Jackson等。
① 性能:Jackson > Fastjson > Gson >同个结构
② Jackson、Fastjson、Gson 类库各有特点,各有自己的专长
Jackson是spring-boot-starter-json依赖的一部分,spring-boot-starter-web中包含spring-boot-starter-json。也就是说当项目中引入了
spring-boot-starter-web后会自动引入spring-boot-starter-json,而不需要单独引入
一、注解
1、基础注解
注解 | 用法 |
---|---|
@JsonProperty | 用于属性,把属性的名称序列化时转换为另外一个名称。示例:@JsonProperty("birth_date") private Date birthDate |
@JsonIgnore | 可用于字段、getter/setter、构造函数参数上,作用相同,都会对相应的字段产生影响。使相应字段不参与序列化和反序列化。 |
@JsonIgnoreProperties | 该注解是类注解,使得相应字段不参与序列化和反序列化。eg:@JsonIgnoreProperties({"password","id"}) public class Person |
@JsonFormat | 用于属性或者方法,把属性的格式序列化时转换成指定的格式。示例:@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm") public Date getBirthDate() |
@JsonPropertyOrder | 该注解是类注解,和 @JsonProperty的index属性类似,指定属性在序列化时 json 中的顺序 , 示例:@JsonPropertyOrder({ "birth_Date", "name" }) public class Person |
@JsonCreator | 用于构造方法,和 @JsonProperty 配合使用,适用有参数的构造方法。示例:@JsonCreator public Person(@JsonProperty("name")String name) {…} |
@JsonAnySetter | 用于属性或者方法,设置未反序列化的属性名和值作为键值存储到 map 中 @JsonAnySetter public void set(String key, Object value) { map.put(key, value); } |
@JsonAnyGetter | 应用于属性或方法,获取所有未序列化的属性 public Map<String, Object> any() { return map; } |
@JsonSetter | 应用于属性或方法,指定反序列化的字段名 @JsonSetter("_id") public String setId(String id) { return this.id=id; } |
@JsonGetter | 应用于方法或字段,指定序列化的字段名 @JsonGetter("_id") public String getId() { return id; } |
@JsonNaming | 类注解。序列化的时候该注解可将驼峰命名的字段名转换为下划线分隔的小写字母命名方式。反序列化的时候可以将下划线分隔的小写字母转换为驼峰命名的字段名。示例:@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) |
@JsonRootName | 类注解。需开启mapper.enable(SerializationFeature.WRAP_ROOT_VALUE) ,用于序列化时输出带有根属性名称的JSON串,形式如 {"root_name":{"id":1,"name":"zhangsan"}} 。 |
@JsonAutoDetect | 指定属性(反)序列化范围 |
@JsonIgnoreType | 将忽略这个类型的(反)序列化 |
@JsonInclude | 对空值如何序列化 |
@JsonPropertyDescription | json的schema描述 |
@JsonUnwrapped | 将其属性上拉一个层级展开 |
@JsonView | 不同接口下返回不同的属性 eg:@JsonView的使用 |
@JacksonInject | json字段有一些缺少的属性,抓换成实体类的时候没有的属性将为null,但是我们在某些需求当中需要将为null的属性都设置为默认 |
@JsonEnumDefaultValue | 反序列化时未知时的枚举值 |
@JsonRawValue | 使用原始值,而不会进行转义 eg:"content":"Test content" ,而不是\"content\":\"Test content\" |
@JsonValue | 最多能用于类的一个属性(多个属性应用此注解将抛出异常),并将此属性上拉一个层级展开,其他字段不参与(反)序列化 |
@JsonKey | 最多能用于类的一个属性(多个属性应用此注解将抛出异常),这个类型对象作为Map数据结构的Key时,标记此注解的属性值将作为json字符串的字段名 |
@JsonFilter | 应用于属性, 过滤属性 eg:@JsonFilter("non-pwd") private char[] password = new char[]{'0', '\u0343', '&'}; mapper.setFilterProvider(new SimpleFilterProvider().addFilter("non-pwd", SimpleBeanPropertyFilter.serializeAllExcept("password"))); |
@JsonAlias | 应用于属性,反序列化时多个候选字段名能够映射到同一个属性上 |
@JsonMerge | 应用于属性,反序列化时集合类型属性时,将Json中的元素与字段中的默认元素融合 eg:@JsonMerge private List<String> hobbies = new ArrayList<>(Collections.singletonList("篮球")); |
2、常用注解示例
2.1、JsonProperty
类似于sql里字段的别名,用于序列化,使用注解字段属性,替代原字段属性
@JsonProperty("userName")
private String name;
序列化结果为:在序列化的json串中,userName替代了name
{"userName":"tom"}
2.2、JsonIgnore
在序列化时忽略该字段
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User {@JsonIgnoreprivate Long id;@JsonProperty("userName")private String name;@JsonIgnoreprivate Integer age;@JsonIgnoreprivate Date birthday;
}序列化结果为:
{"userName":"tom"}
2.3、JsonIgnoreProperties
1、序列化@JsonIgnoreProperties与@JsonIgnore类似,用于类上,注解使用的是字段别名
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.Date;@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties({"id","userName","birthday"})
public class User {private Long id;@JsonProperty("userName")private String name;private Integer age;private