jackson-ObjectMapper
jackson最常用的api就是基于'对象绑定'的ObjectMapper
将object序列化json
使用writeValue的系列的方法将java对象序列化为json,并且可以存储成不同的格式
- writeValueAsString(Object value):将对象转换成字符串
- writeValueAsBytes(Object value):将对象转换成字节数组
- writeValue(File resultFile,Object value):将对象存储成文件
规则:
- 如果字段的修饰符是public,则该字段可以序列化和反序列化
- 如果字段的修饰符不是public,但是它的getter方法和setter方法是public,则该字段可序列化和反序列化
- 如果字段只有public的getter方法,而无public的setter方法,则该字段只能用于序列化
- 如果字段只有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>>(){});
自定义序列化和反序列化
序列化
- 创建一个类,并继承于
StdSerializer
- 重写
serialize()
方法 - 利用参数JsonGenerator生成json
- 通过
SimpleModule
类创建一个序列化对象 - 然后用
ObjectMapper
的registerModule()
方法,将序列化对象注册
反序列化
- 创建一个类,并继承于
StdDeserializer
- 重写
deserialize()
方法 - 利用参数JsonGenerator读取json
- 通过
SimpleModule
类创建一个反序列化对象 - 然后用
ObjectMapper
的registerModule()
方法,将反序列化对象注册
小技巧
忽略多余字段
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false)
忽略null属性
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
忽略默认值的属性
mapper.setDefaultPropertyInclusion(JsonInclude.Include.NON_DEFAULT);
时间格式化
-
注解方式
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss"
-
代码方式
mapper.setDateFormat(StdDateFormat.getDateTimeInstance());
字段过滤
- 单个字段: @JsonIgnore
- 多个字段: @JsonIgnoreProperties