Jackson框架使用教程
介绍
Jackson是Spring MVC 的默认 json 解析器。本文对比我们常用的fastjson进行简单是使用教程。
maven依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.2</version>
</dependency>
在springboot中我们引入spring-boot-starter-web
后会自动依赖jackson
ObjectMapper创建
ObjectMapper objectMapper = new ObjectMapper();
对象转换
User user = new User();
user.setName("rongK");
user.setAge(28);
user.setCreateTime(new Timestamp(new Date().getTime()));
String s = objectMapper.writeValueAsString(user);
System.out.println("对象序列化:" + s);// 对象序列化:{"name":"rongK","age":28,"createTime":1598081001761}
User u = objectMapper.readValue(s, User.class);
System.out.println("对象反序列化:" + u);// 对象反序列化:User(name=rongK, age=28, createTime=2020-08-22 15:23:21.761)
集合转换
List<User> list = new ArrayList<>();
for (int i = 0; i < 2; i++) {
User user = new User();
user.setName("rongK" + i);
user.setAge(i);
user.setCreateTime(new Timestamp(new Date().getTime()));
list.add(user);
}
String s = objectMapper.writeValueAsString(list);
System.out.println("集合序列化:" + s);// 集合序列化:[{"name":"rongK0","age":0,"createTime":1598081001764},{"name":"rongK1","age":1,"createTime":1598081001764}]
List<User> userList = objectMapper.readValue(s, new TypeReference<List<User>>(){});
System.out.println("集合反序列化:" + userList);// 集合反序列化:[User(name=rongK0, age=0, createTime=2020-08-22 15:23:21.764), User(name=rongK1, age=1, createTime=2020-08-22 15:23:21.764)]
map转换
HashMap<String, Object> map = new HashMap<>();
map.put("name", "rong");
map.put("age", "11");
map.put("createTime", new Timestamp(new Date().getTime()));
String s = objectMapper.writeValueAsString(map);
System.out.println("Map序列化:" + s);// Map序列化:{"createTime":1598081001743,"name":"rong","age":"11"}
User user= objectMapper.readValue(s, User.class);
System.out.println("Map反序列化:" + user);// Map反序列化:User(name=rong, age=11, createTime=2020-08-22 15:23:21.743)
HashMap userMap= objectMapper.readValue(s, HashMap.class);
System.out.println("Map反序列化:" + userMap);// Map反序列化:{createTime=1598081001743, name=rong, age=11}
Map<String, User> userMap2 = new HashMap<>();
for (int i = 0; i < 2; i++) {
User u = new User();
u.setName("rongK" + i);
u.setAge(i);
u.setCreateTime(new Timestamp(new Date().getTime()));
userMap2.put("key"+i, u);
}
String s2 = objectMapper.writeValueAsString(userMap2);
System.out.println("Map序列化:" + s2);// ap序列化:{"key1":{"name":"rongK1","age":1,"createTime":1598081001759},"key0":{"name":"rongK0","age":0,"createTime":1598081001759}}
Map<String, User> map3= objectMapper.readValue(s2, new TypeReference<Map<String, User>>() {});
System.out.println("Map反序列化:" + map3);// Map反序列化:{key1=User(name=rongK1, age=1, createTime=2020-08-22 15:23:21.759), key0=User(name=rongK0, age=0, createTime=2020-08-22 15:23:21.759)}
json对象操作
ObjectNode userNode = objectMapper.createObjectNode();
userNode.put("name", "rong");
userNode.put("age", 13);
userNode.set("node", objectMapper.createObjectNode());
System.out.println("构建 ObjectNode:" + userNode.toString());// 构建 ObjectNode:{"name":"rong","age":13,"node":{}}
//通过 path 查找节点
JsonNode name = userNode.path("name");
System.out.println("查找子节点 name:" + name.asText());// 查找子节点 name:rong
//读取 json
JsonNode rootNode = objectMapper.readTree(userNode.toString());
System.out.println("Json 转 JsonNode:" + rootNode);// Json 转 JsonNode:{"name":"rong","age":13,"node":{}}
//在反序列化时忽略在 json 中存在但 Java 对象不存在的属性
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
//JsonNode 转换成 java 对象
User user = objectMapper.treeToValue(userNode, User.class);
System.out.println("JsonNode 转对象:" + user);// JsonNode 转对象:User(name=rong, age=13, createTime=null)
//java 对象转换成 JsonNode
JsonNode node = objectMapper.valueToTree(user);
System.out.println("对象转 JsonNode:" + node);// 对象转 JsonNode:{"name":"rong","age":13,"createTime":null}
相关配置
//在反序列化时忽略在 json 中存在但 Java 对象不存在的属性
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
//在序列化时自定义时间日期格式
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
//在序列化时忽略值为 null 的属性
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
//在序列化时忽略值为默认值的属性
objectMapper.setDefaultPropertyInclusion(JsonInclude.Include.NON_DEFAULT);