Jackson - 使用
🌻 Jakcson介绍
Jackson用于Json的序列化(serialization)和反序列化(deserialization)。
Jackson包含三个包jackson-core、jackson-annotation、jackson-databind,作用如下
jackson-core- 基于流解析Json,就是从流中读取,生成事件,类似xml的sax。核心类是JsonGenerator和JsonParser。jackson-annotation- 提供了注解jackson-databind- 对jackson-core进行封装,可以实现Json和Pojo转换、Json和Json树(类似dom树)转换。核心类是ObjectMapper、JsonNode
🍀 Jackson常用对象
ObjetcMapper - 配置序列化、设置包含哪些field、序列化和反序列化
- writerWithDefaultPrettyPrinter() - 获取Objectwriter,用于把Pojo转换成Json
- readValue() - Json转成Pojo
- getJavaTypeFactory() - JavaType工厂,Json转Pojo时候,提供JavaType
- config() - 配置序列化和反序列化,使用DeserializationFeature和SerializationFeature
- setSerializationInclusion() - 配置序列化包含那些field
ObjectWriter - 把Pojo转成Json
- writeValueAsString() - Pojo转Json,保存在str中
- writeValue() - Pojo转Json,保存在File、Stream、Output中
- writeValueAsByte() - Pojo转Json,保存在byte[]中
JavaTypeFactory - 获取JavaType
JavaType - 反序列化,转成JavaType 提供的类型
TypeReference - 反序列化,转成TypeRefence提供的类型
DeserializationInclusionFeature - 常量,用于配置反序列化
SerializationInclusionFeature - 常量,用于配置序列化
JsonInclude.Include - 常量,配置序列化包含什么字段
🌾 Jackson - 导包
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.2</version>
</dependency>
🌿 Jackson使用 - 序列化和反序列化Pojo、List、Array
// 准备实体类
Employee emp = new Employee(1, "yuki", null, 0, "Java开发",
2333.33, new Date(), new Address("bj", "xx大厦-203"));
Employee emp1 = new Employee(1, "yuki", null, 0, "Java开发",
2333.33, new Date(), new Address("bj", "xx大厦-203"));
List<Employee> emps = new ArrayList<Employee>();
emps.add(emp);
emps.add(emp1);
// 🍊 1. obj -> str
String s = new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(emp);
System.out.println(s);
System.out.println("--------------------");
// 🍊 2. str -> obj
Employee e = new ObjectMapper().readValue(s, Employee.class);
System.out.println(e);
System.out.println("--------------------");
// 🍊 3. list -> str
String empsStr = new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(emps);
System.out.println(empsStr);
System.out.println("--------------------");
// 🍊 4. str -> list
ObjectMapper mapper = new ObjectMapper();
List emplist = mapper.readValue(empsStr, List.class);
System.out.println(emplist);
// 🍊 5. str -> Arr(TypeReference、JavaType)
Employee[] empArr = mapper.readValue(empsStr, new TypeReference<Employee[]>(){});;
System.out.println(empArr.length);
System.out.println("--------------------");
🍃 Jackson使用 - TypeReference和JavaType使用
/*
🍒 使用TypeReference和JavaType获取泛型List
*/
ObjectMapper mapper = new ObjectMapper();
List emplist = mapper.readValue(empsStr, List.class);
List<Employee> emplist2 = mapper.readValue(empsStr, new TypeReference<List<Employee>>(){});
JavaType javaType = mapper.getTypeFactory().constructCollectionLikeType(List.class, Employee.class);
List<Employee> emplist3 = mapper.readValue(empsStr, javaType);
/*
🍒 使用TypeReference和JavaType获取数组
*/
Employee[] empArr = mapper.readValue(empsStr, new TypeReference<Employee[]>(){});
Employee[] empArr2 = mapper.readValue(empsStr,mapper.getTypeFactory().constructArrayType(Employee.class));
🌳 Jackson使用 - 配置序列化和反序列化
DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES- 反序列化时,json中包含pojo中不存在字段,是否报错SerializationFeature.WRITE_DATES_AS_TIMESTAMPS-- 指定格式化后的日期是str,而不是timestampJsonInclude.Include.NON_NULL- 序列化时不包含nullJsonInclude.Include.NON_DEFAULT- 序列化时忽略default值
/**
🍑配置SerializationFeature和DeserializationFeature
*/
ObjectMapper objectMapper = new ObjectMapper();
objectMapper
// 🍑 反序列化 - 不存在字段 - 是否报错
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false)
// 🍑 序列化 - 日期 - 格式为yyyy-MM-dd'T'HH:mm:ss
.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false)
// 🍑 序列化 - null - 忽略
.setSerializationInclusion(JsonInclude.Include.NON_NULL)
// 🍑 序列化 - 默认值 - 忽略
.setSerializationInclusion(JsonInclude.Include.NON_DEFAULT);
🌲 Jackson使用 - jackson注解
@JsonInclude- 设置include@JsonProperty- filed和str对应关系@JsonFormat- date格式化@JsonPropertyOrder- 设置field顺序
/*
* 4. JSON注解
* @JsonInclude - 设置包含字段
* @JsonProperty - 指定str和field对应关系
* @JsonFormat - 日期格式化
* @JsonPropertyOrder - 序列化顺序
* */
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({"id"})
public class Teacher {
// id
private Integer id;
// name gender age
@JsonProperty("username")
private String name;
private String gender;
private Integer age;
// job salary entryDate
private String job;
private Double salary;
@JsonFormat(timezone = "+8:00",pattern = "yyyy-MM-dd HH:mm:ss")
private Date entryDate;
// 地址
private com.yuki.jackson.entity.Address Address;
}

浙公网安备 33010602011771号