Jackson - 使用

🌻 Jakcson介绍

Jackson用于Json序列化(serialization)反序列化(deserialization)

Jackson包含三个包jackson-corejackson-annotationjackson-databind,作用如下

  • jackson-core - 基于流解析Json,就是从流中读取,生成事件,类似xml的sax。核心类是JsonGeneratorJsonParser
  • jackson-annotation - 提供了注解
  • jackson-databind - 对jackson-core进行封装,可以实现Json和Pojo转换Json和Json树(类似dom树)转换。核心类是ObjectMapperJsonNode

🍀 Jackson常用对象

ObjetcMapper - 配置序列化设置包含哪些field序列化和反序列化

  • writerWithDefaultPrettyPrinter() - 获取Objectwriter,用于把Pojo转换成Json
  • readValue() - Json转成Pojo
  • getJavaTypeFactory() - JavaType工厂,Json转Pojo时候,提供JavaType
  • config() - 配置序列化和反序列化,使用DeserializationFeatureSerializationFeature
  • 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,而不是timestamp
  • JsonInclude.Include.NON_NULL - 序列化时不包含null
  • JsonInclude.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;
}

🍖 参考连接

Jackson 的 基本用法

Jackson反序列化泛型List(使用JavaType将json字符串转换成泛型List)

posted @ 2021-03-01 19:57  全力一拼  阅读(360)  评论(0)    收藏  举报