前后端分离开发中常用到的数据交互方式就是json。本文主要讲解对jackson对json的相关操作。
jackson
基础篇
1、引入依赖:
<!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
2、、创建ObjectMapper常用配置
private static final ObjectMapper objectMapper;
static {
objectMapper = new ObjectMapper(); // 对象的所有字段全部列入,还是其他的选项,可以忽略null等
objectMapper.setSerializationInclusion(Include.ALWAYS); // 设置Date类型的序列化及反序列化格式
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); // 忽略空Bean转json的错误
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); // 忽略未知属性,防止json字符串中存在,而java对象中不存在对应属性的情况出现错误
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // 注册一个时间序列化及反序列化的处理模块,用于解决jdk8中localDateTime等的序列化问题
objectMapper.registerModule(new JavaTimeModule());}
本文中用到的测试类,后续测试均使用本类
public class JsonUser {
private String userName;
private String pwd; private String address;
private List<String> user_phone;
private JsonPet pet; //基础篇还用不到,解决对象内嵌套问题
//省略构造器、get()、set()、toString()
}
public class JsonPet {
private String name;
private String age;
//省略构造器、get()、set()、toString()列
}
3、对象转json字符串
JsonUser user = new JsonUser("张三", "1246", "北京市海淀区", Collections.singletonList("15838609251")); //对象转json字符串 String s = objectMapper.writeValueAsString(user); System.out.println(s);
输出:
{“userName”:“张三”,“pwd”:“1246”,“address”:“北京市海淀区”,“user_phone”:“15838609251”}
注1:对象转json需要属性拥有get方法。这种方式是通过get方法来获取对象属性的,少几个get方法,输出的字符串就少几个属性。
注2:注:对象中的Map、List属性,转换的时候,会默认转换(不需要额外的配置)。
4、json字符串转对象
String str = "{\"userName\":\"张三\",\"pwd\":\"1246\",\"address\":\"北京市海淀区\",\"user_phone\":[\"15838609251\"]}"; JsonUser jsonUser = objectMapper.readValue(str, JsonUser.class);
基础篇到这里就结束了。想来,我们的小伙伴肯定有很多疑问,使用中肯定会遇到各种问题,下面的高级篇将进行详细讲解。
高级篇
问题1: 假设反序列化的json里面有个字段,在POJO类中没有,会反序列失败。
基础篇中的测试实体类JsonUser里面有一个字段pet,这也是一个实体类。
如果直接执行如下代码:
String str = "{\"userName\":\"张三\",\"pwd\":\"1246\",\"address\":\"北京市海淀区\",\"user_phone\":[\