jackson-ObjectMapper

jackson-ObjectMapper

起男 765 2020-12-14

jackson-ObjectMapper

jackson最常用的api就是基于'对象绑定'的ObjectMapper

将object序列化json

使用writeValue的系列的方法将java对象序列化为json,并且可以存储成不同的格式

  • writeValueAsString(Object value):将对象转换成字符串
  • writeValueAsBytes(Object value):将对象转换成字节数组
  • writeValue(File resultFile,Object value):将对象存储成文件

规则:

  1. 如果字段的修饰符是public,则该字段可以序列化和反序列化
  2. 如果字段的修饰符不是public,但是它的getter方法和setter方法是public,则该字段可序列化和反序列化
  3. 如果字段只有public的getter方法,而无public的setter方法,则该字段只能用于序列化
  4. 如果字段只有publlic的setter方法,而无public的getter方法,则该字段只能用于反序列化

getter方法用于序列化,setter方法用于反序列化

将json反序列化为object

使用readValue的系列的方法从不同的数据源将json反序列化为java对象

  • readValue(String content,Class<T> valueType):将字符串反序列化为对象
  • readValue(byte[] src,Class<T> valueType):将字节数组反序列化为对象
  • readValue(File src,Class<T> valueType):将文件反序列化为对象

反序列化的对象必须有一个空参的构造方法,否则会抛出异常

JsonNode

ObjectMapper可以将json解析为基于“树模型”的JsonNode对象

String json = "{ \"name\" : \"张三\", \"age\" : 18 }";

ObjectMapper mapper = new ObjectMapper();
JsonNode jsonNode = mapper.readTree(json);
String name = jsonNode.get("name").asText();
System.out.println(name); // 张三

TypeReference

TypeReference可以将json字符串数组转换成泛型List

String json = "[{ \"name\" : \"张三\", \"age\" : 18 }, { \"name\" : \"李四\", \"age\" : 19 }]";

ObjectMapper mapper = new ObjectMapper();
List<User> userList = mapper.readValue(json, new TypeReference<List<User>>(){});

自定义序列化和反序列化

序列化

  1. 创建一个类,并继承于StdSerializer
  2. 重写serialize()方法
  3. 利用参数JsonGenerator生成json
  4. 通过SimpleModule类创建一个序列化对象
  5. 然后用ObjectMapperregisterModule()方法,将序列化对象注册

反序列化

  1. 创建一个类,并继承于StdDeserializer
  2. 重写deserialize()方法
  3. 利用参数JsonGenerator读取json
  4. 通过SimpleModule类创建一个反序列化对象
  5. 然后用ObjectMapperregisterModule()方法,将反序列化对象注册

小技巧

忽略多余字段

mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false)

忽略null属性

mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

忽略默认值的属性

mapper.setDefaultPropertyInclusion(JsonInclude.Include.NON_DEFAULT);

时间格式化

  1. 注解方式

    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss"
    
  2. 代码方式

    mapper.setDateFormat(StdDateFormat.getDateTimeInstance());
    

字段过滤

  1. 单个字段: @JsonIgnore
  2. 多个字段: @JsonIgnoreProperties