目录
- 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 和 Setters
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;
}
}
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 注解的构造器
@JsonCreator
public 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 和 Setters
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;
}
}
如果不希望使用无参构造器,或者类设计不允许,可以使用 Jackson 的 @JsonCreator 注解,明确指定哪个构造器用于反序列化
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
class Person {
private String name;
private int age;
// 使用 @JsonCreator 注解指定构造器用于反序列化
@JsonCreator
public Person(@JsonProperty("name") String name, @JsonProperty("age") int age) {
this.name = name;
this.age = age;
}
// Getters 和 Setters
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;
}
}
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 对象序列化为 JSON
String 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 注解指定构造器用于反序列化
@JsonCreator
public Person(@JsonProperty("name") String name, @JsonProperty("age") int age) {
this.name = name;
this.age = age;
}
// Getters 和 Setters
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;
}
}
截图如下: