1. Jackson介绍
Jackson一个java处理json的类库,社区活跃,更新速度也很快。相比gson、fastjson等,强力推荐使用Jackson。
Jackson 有三个核心包,分别是 Streaming、Annotations、Databind,通过这些包可以方便的对 JSON 进行操作。
Streaming 在 jackson-core 模块。定义了一些低级别流处理相关的API以及特定的JSON实现。
Annotations 在 jackson-annotations 模块,包含了Jackson中的注解。
Databind 在 jackson-databind 模块, 在Streaming包的基础上实现了数据绑定,依赖于Streaming和Annotations包。
2. Jackson maven引入
我们需要引入以上三个核心模块,不过由于jackson-databind依赖了jackson-core和 jackson-annotations,所以只需要引入jackson-databind即可。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.2</version>
</dependency>
<!--
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.13.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.13.2</version>
</dependency>
-->
3. 主要类和api介绍
ObjectMapper
ObjectMapper提供了读写JSON的功能,既可以读写基本pojo,也可以读写通用JSON树模型(JsonNode),还提供了执行转换的相关功能。之所以称为ObjectMapper就是因为他负责json和java对象之间的映射转换。(对于时间类型的转换,要注意字符串的时间格式,不满足则使用objectMapper.setDateFormat来设置时间格式)常用的方法如:
1)readValue方法将json反序列化为java对象
readValue接收参数 Class/JavaType/TypeReference,JavaType只能通过com.fasterxml.jackson.databind.type.TypeFactory来创建,TypeReference是抽象类,直接new匿名实现即可。比如构造 Map<String, Object>,
new TypeReference<Map<String, Object>>() {};
objectMapper.getTypeFactory().constructMapType(Map.class, String.class, Object.class);
2)writeValue方法将对象序列化成指定目标
3)readTree方法将json反序列化为JsonNode
4)valueToTree方法将java对象转换为JsonNode
5)treeToValue方法将JsonNode转换为java对象
JsonNode
所有JSON节点的基类,它构成了Jackson实现的JSON树模型(JSON Tree Model)的基础。可以将其视为类似于XML DOM树中的DOM节点。若想修改或访问 json 部分属性,树模型是不错的选择。程序中常用的子类是ObjectNode。
1)xxxValue方法 返回该节点的对应类型值(和asXXX的区别就是asXXX有个转换的过程)
2)get 方法获取到某个节点
3)findValue方法查找某个节点
4. 使用案例
包含 json字符串转换为 java对象,json字符串转换为 java map,json数组转换为 java list,java对象转换为 json字符串,树模型处理获取 json字符串里某个字段值,修改 json字符串里的字段值等。
代码示例如下:
public class Test {
public static void main(String[] args) throws JsonProcessingException {
String jsonStr = "{\"userId\":1001,\"userName\":\"iouy\",\"city\":\"chengdu\",\"age\":21,\"sex\":1," +
"\"phone\":\"15227654561\",\"address\":\"凤凰大街118号\",\"registerTime\":\"2024-03-11 13:11:11\"}";
ObjectMapper objectMapper = new ObjectMapper();
String jsonArray = "[{\"userId\":1001,\"userName\":\"iouy\",\"city\":\"chengdu\",\"age\":21,\"sex\":1," +
"\"phone\":\"15227654561\",\"address\":\"凤凰大街118号\",\"registerTime\":\"2024-03-11 13:11:11\"}," +
"{\"userId\":1002,\"userName\":\"kdas\",\"city\":\"chengdu\",\"age\":22,\"sex\":0," +
"\"phone\":\"15127654561\",\"address\":\"凤凰大街111号\",\"registerTime\":\"2022-03-11 12:13:13\"}]";
// json字符串转换为 java对象
Person person = objectMapper.readValue(jsonStr, Person.class);
System.out.println("json字符串转换为 java对象");
System.out.println(person);
// json字符串转换为 java map
Map<String, Object> jsonMap = objectMapper.readValue(jsonStr, Map.class);
// 或者通过以下两种方式传参
// Map<String, Object> jsonMap = objectMapper.readValue(jsonStr, objectMapper.getTypeFactory().constructMapType(Map.class, String.class, Object.class));
// Map<String, Object> jsonMap = objectMapper.readValue(jsonStr, new TypeReference<Map<String, Object>>() {});
System.out.println("json字符串转换为 java map");
System.out.println(jsonMap);
//json数组转换为 java list
List<Person> personList = objectMapper.readValue(jsonArray, new TypeReference<List<Person>>() {});
System.out.println("json数组转换为 java list");
System.out.println(personList);
// java对象转换为 json字符串
String jsonStrFromJavaPerson = objectMapper.writeValueAsString(person);
System.out.println("java对象转换为 json字符串");
System.out.println(jsonStrFromJavaPerson);
// 树模型处理
// 获取 json字符串里某个字段值
JsonNode jsonNode = objectMapper.readTree(jsonStr);
System.out.println("获取json字符串里的 city字段值");
System.out.println(jsonNode.get("city").textValue());
// 修改 json字符串里的 city值
ObjectNode objectNode = (ObjectNode) jsonNode;
objectNode.put("city", "city_change");
System.out.println("修改city值后的json字符串为");
System.out.println(objectNode.toString());
}
public static class Person {
private long userId;
private String userName;
private String city;
private int age;
private int sex;
private String phone;
private String address;
private String registerTime;
public Person() {
}
public long getUserId() {
return userId;
}
public void setUserId(long userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getRegisterTime() {
return registerTime;
}
public void setRegisterTime(String registerTime) {
this.registerTime = registerTime;
}
@Override
public String toString() {
return "Person{" +
"userId=" + userId +
", userName='" + userName + '\'' +
", city='" + city + '\'' +
", age=" + age +
", sex=" + sex +
", phone='" + phone + '\'' +
", address='" + address + '\'' +
", registerTime='" + registerTime + '\'' +
'}';
}
}
}
运行结果如下:
json字符串转换为 java对象
Person{userId=1001, userName='iouy', city='chengdu', age=21, sex=1, phone='15227654561', address='凤凰大街118号', registerTime='2024-03-11 13:11:11'}
json字符串转换为 java map
{userId=1001, userName=iouy, city=chengdu, age=21, sex=1, phone=15227654561, address=凤凰大街118号, registerTime=2024-03-11 13:11:11}
json数组转换为 java list
[Person{userId=1001, userName='iouy', city='chengdu', age=21, sex=1, phone='15227654561', address='凤凰大街118号', registerTime='2024-03-11 13:11:11'}, Person{userId=1002, userName='kdas', city='chengdu', age=22, sex=0, phone='15127654561', address='凤凰大街111号', registerTime='2022-03-11 12:13:13'}]
java对象转换为 json字符串
{"userId":1001,"userName":"iouy","city":"chengdu","age":21,"sex":1,"phone":"15227654561","address":"凤凰大街118号","registerTime":"2024-03-11 13:11:11"}
获取json字符串里的 city字段值
chengdu
修改city值后的json字符串为
{"userId":1001,"userName":"iouy","city":"city_change","age":21,"sex":1,"phone":"15227654561","address":"凤凰大街118号","registerTime":"2024-03-11 13:11:11"}