目录
- 1. 基本知识
- 2. 基本操作
- 2.1 转换Java对象为JSON
- 2.2 转换JSON为Java对象
- 3. 拓展
1. 基本知识
ObjectMapper 是 Jackson 数据处理库中的核心类之一,主要用于将 Java 对象转换为 JSON 和将 JSON 转换为 Java 对象
Jackson 是当前最流行的 JSON 处理库之一,提供了灵活且高效的 JSON 序列化与反序列化机制,推荐阅读:详细分析Java中的@JsonSerialize注解
主要功能:
- 序列化 (Serialization):将 Java 对象转换为 JSON 字符串
- 反序列化 (Deserialization):将 JSON 字符串转换为 Java 对象
- 读取和写入:ObjectMapper 可以将 JSON 直接读取到 Java 对象,或将 Java 对象直接写入文件
2. 基本操作
2.1 转换Java对象为JSON
转换Java对象为JSON,称为 序列化
import com.fasterxml.jackson.databind.ObjectMapper;public class ObjectMapperExample {public static void main(String[] args) {ObjectMapper objectMapper = new ObjectMapper();// 创建一个示例对象Person person = new Person("John", 30);try {// 将 Java 对象转换为 JSON 字符串String jsonString = objectMapper.writeValueAsString(person);System.out.println("序列化后的JSON字符串: " + jsonString);} catch (Exception e) {e.printStackTrace();}}
}class Person {private String name;private int age;// 构造器public Person(String name, int age) {this.name = name;this.age = age;}// Getters 和 Setterspublic String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
writeValueAsString() 方法将对象序列化为 JSON 字符串
通过 Person 类中的 getter 和 setter 方法,Jackson 自动提取对象中的字段值
截图如下:
2.2 转换JSON为Java对象
正确代码如下:
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;public class ObjectMapperExample {public static void main(String[] args) {ObjectMapper objectMapper = new ObjectMapper();String jsonString = "{\"name\":\"John\",\"age\":30}";try {// 将 JSON 字符串反序列化为 Person 对象Person person = objectMapper.readValue(jsonString, Person.class);System.out.println("反序列化后的Person对象: " + person.getName() + ", " + person.getAge());} catch (Exception e) {e.printStackTrace();}}
}class Person {private String name;private int age;// 使用 @JsonCreator 注解的构造器@JsonCreatorpublic Person(@JsonProperty("name") String name, @JsonProperty("age") int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
截图如下:
对于这种需要注意如下点:
- 为 Person 类添加一个无参构造器
- 或者使用 Jackson 提供的注解 来告诉 Jackson 使用特定的构造器进行反序列化
Jackson 反序列化时,通常需要一个无参构造器,除非显式使用了其它反序列化策略。因此,简单地为 Person 类添加一个无参构造器可以解决这个问题
class Person {private String name;private int age;// 无参构造器public Person() {}// 全参构造器public Person(String name, int age) {this.name = name;this.age = age;}// Getters 和 Setterspublic String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
如果不希望使用无参构造器,或者类设计不允许,可以使用 Jackson 的 @JsonCreator 注解,明确指定哪个构造器用于反序列化
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;class Person {private String name;private int age;// 使用 @JsonCreator 注解指定构造器用于反序列化@JsonCreatorpublic Person(@JsonProperty("name") String name, @JsonProperty("age") int age) {this.name = name;this.age = age;}// Getters 和 Setterspublic String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
3. 拓展
常用方法如下:
writeValueAsString(Object obj)
:将对象序列化为 JSON 字符串writeValue(File file, Object obj)
:将对象序列化并写入文件readValue(String content, Class<T> valueType)
:将 JSON 字符串反序列化为 Java 对象readValue(File src, Class<T> valueType)
:从文件中读取 JSON,并反序列化为 Java 对象
高级用法如下:
1. 自定义序列化与反序列化
Jackson 提供了注解如 @JsonSerialize 和 @JsonDeserialize,可以自定义对象的序列化和反序列化过程,例如:
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;@JsonSerialize(using = CustomPersonSerializer.class)
@JsonDeserialize(using = CustomPersonDeserializer.class)
public class Person {private String name;private int age;// 构造器、getter、setter 省略
}
2. 处理复杂的 JSON 结构
对于嵌套结构或者集合,可以使用泛型,如 List<T> 或 Map<String, Object>
来处理
import com.fasterxml.jackson.core.type.TypeReference;public class ObjectMapperExample {public static void main(String[] args) {ObjectMapper objectMapper = new ObjectMapper();String jsonString = "[{\"name\":\"John\",\"age\":30}, {\"name\":\"Jane\",\"age\":25}]";try {// 反序列化为 List<Person>List<Person> people = objectMapper.readValue(jsonString, new TypeReference<List<Person>>(){});people.forEach(person -> System.out.println(person.getName() + ", " + person.getAge()));} catch (Exception e) {e.printStackTrace();}}
}
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;public class ObjectMapperExample {public static void main(String[] args) {ObjectMapper objectMapper = new ObjectMapper();// 示例 1: Java对象序列化为JSON字符串Person person = new Person("John", 30);try {// 将 Java 对象序列化为 JSONString jsonString = objectMapper.writeValueAsString(person);System.out.println("序列化后的JSON字符串: " + jsonString);} catch (Exception e) {e.printStackTrace();}// 示例 2: 将JSON字符串反序列化为Java对象String json = "{\"name\":\"Jane\",\"age\":25}";try {// 将 JSON 字符串反序列化为 Java 对象Person deserializedPerson = objectMapper.readValue(json, Person.class);System.out.println("反序列化后的Person对象: " + deserializedPerson.getName() + ", " + deserializedPerson.getAge());} catch (Exception e) {e.printStackTrace();}// 示例 3: 处理嵌套JSON结构 (List)String jsonArray = "[{\"name\":\"John\",\"age\":30}, {\"name\":\"Jane\",\"age\":25}]";try {// 反序列化为 List<Person>List<Person> people = objectMapper.readValue(jsonArray, new TypeReference<List<Person>>(){});for (Person p : people) {System.out.println("姓名: " + p.getName() + ", 年龄: " + p.getAge());}} catch (Exception e) {e.printStackTrace();}}
}// Person 类定义
class Person {private String name;private int age;// 使用 @JsonCreator 注解指定构造器用于反序列化@JsonCreatorpublic Person(@JsonProperty("name") String name, @JsonProperty("age") int age) {this.name = name;this.age = age;}// Getters 和 Setterspublic String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
截图如下: