在spring boot中,默认使用Jackson来实现java对象到json格式的序列化与反序列化。如第3篇讲的@RequestBody和@ResponseBody的转换,最终都是由Jackson来完成的。
Jackson的转换是通过ObjectMapper对象来实现的,spring boot内部自动配置了一个ObjectMapper对象,我们可以直接用。
@Autowired
ObjectMapper objectMapper;
@GetMapping("/hello")
public void hello() throws IOException {
User user1 = new User();
user1.setId("1");
user1.setName("tom");
//序列化
String json = objectMapper.writeValueAsString(user1);
System.out.println(json);
//反序列化
User user2 = objectMapper.readValue(json, User.class);
System.out.println(user2.getId());
System.out.println(user2.getName());
writeValueAsString:是将参数中的java对象序列化为json字符串。
readValue:是将json字符串反序列化为java对象,User.class就是指定对象的类型。
最终输出如下
String json = "[{\"id\":\"1\",\"name\":\"tom\"},{\"id\":\"2\",\"name\":\"jerry\"}]";
JavaType javaType = objectMapper.getTypeFactory().constructParametricType(List.class, User.class);
List list = objectMapper.readValue(json, javaType);
或者
String json = "[{\"id\":\"1\",\"name\":\"tom\"},{\"id\":\"2\",\"name\":\"jerry\"}]";
List list = objectMapper.readValue(json, new TypeReference>() {});
#日期类型格式
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
#日期类型使用中国时区
spring.jackson.time-zone=GMT+8
#序列化所有参数
spring.jackson.default-property-inclusion=always
spring.jackson.date-format:当序列化对象中包含日期类型的参数时,配置其转换的格式,如yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone:有些日期数据可能并不是中国时区,设置GMT+8可将其转换为中国时区
spring.jackson.default-property-inclusion:需要进行序列化的参数,默认值为always指所有。还可配置如下值:
不序列化的参数:指java对象转换为json字符串时,其中不包含该参数。如当id=1,name=null时,always默认序列化为
如配置了不序列化为null的值,结果如下
@JsonProperty("key")
Integer id;
@JsonIgnore:如下,不序列化id参数
@JsonIgnore
Integer id;