Java如何将JSON转换成对象:全面指南与实践
在Java开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,广泛应用于前后端数据交互、配置文件存储等场景,将JSON字符串转换为Java对象(即“反序列化”)是日常开发中的高频操作,本文将详细介绍Java中实现JSON转对象的多种方法,涵盖主流库的使用、核心代码示例及注意事项,帮助开发者高效处理JSON数据。
JSON转对象的核心概念
JSON转对象的过程称为“反序列化”(Deserialization),即将符合JSON格式的字符串(如{"name":"张三","age":25})解析为对应的Java对象(如User类实例),这一过程需要解决两个关键问题:
- JSON与Java类型的映射:JSON的基本类型(字符串、数字、布尔值、null)与Java基本类型及其包装类(
String、Integer、Boolean等)的对应关系;JSON的数组和对象分别对应Java的数组和集合(List、Map等)。 - 对象结构的匹配:JSON的键(key)必须与Java对象的属性名一致(或通过注解映射),属性类型需兼容JSON值的类型。
主流JSON库及实现方法
Java生态中存在多种JSON处理库,其中最常用的是Jackson、Gson和Fastjson(阿里巴巴开源),下面分别介绍这三类库的使用方法。
(一)Jackson:高性能的首选
Jackson是Java生态中最流行的JSON库之一,以其高性能、灵活性和丰富的功能著称,Spring Framework默认使用Jackson处理HTTP请求/响应中的JSON数据。
添加依赖
Maven项目中添加Jackson核心依赖(以jackson-databind为例,它包含了核心功能):
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version> <!-- 建议使用最新版本 -->
</dependency>
基本使用:JSON字符串转Java对象
步骤:
- 定义与JSON结构对应的Java类(POJO,Plain Old Java Object);
- 使用
ObjectMapper类的readValue()方法进行反序列化。
示例:
假设JSON字符串为{"name":"张三","age":25,"isStudent":false},定义对应的User类:
public class User {
private String name;
private int age;
private boolean isStudent;
// 必须提供无参构造方法(Jackson反射时需要)
public User() {}
// getter和setter方法
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; }
public boolean isStudent() { return isStudent; }
public void setStudent(boolean student) { isStudent = student; }
@Override
public String toString() {
return "User{name='" + name + "', age=" + age + ", isStudent=" + isStudent + "}";
}
}
执行JSON转对象:
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonDemo {
public static void main(String[] args) throws Exception {
String jsonStr = "{\"name\":\"张三\",\"age\":25,\"isStudent\":false}";
ObjectMapper objectMapper = new ObjectMapper();
// 将JSON字符串转为User对象
User user = objectMapper.readValue(jsonStr, User.class);
System.out.println(user); // 输出:User{name='张三', age=25, isStudent=false}
}
}
处理复杂JSON:嵌套对象与集合
如果JSON包含嵌套对象或数组,只需在Java类中定义对应的嵌套类或集合类型即可。
示例:JSON字符串{"name":"李四","hobbies":["阅读","编程"],"address":{"city":"北京","district":"海淀区"}},转换为包含嵌套对象和集合的UserDetail类:
import java.util.List;
public class UserDetail {
private String name;
private List<String> hobbies;
private Address address;
// 无参构造方法、getter/setter省略
@Override
public String toString() {
return "UserDetail{name='" + name + "', hobbies=" + hobbies + ", address=" + address + "}";
}
}
class Address {
private String city;
private String district;
// 无参构造方法、getter/setter省略
@Override
public String toString() {
return "Address{city='" + city + "', district='" + district + "'}";
}
}
转换代码:
String jsonStr = "{\"name\":\"李四\",\"hobbies\":[\"阅读\",\"编程\"],\"address\":{\"city\":\"北京\",\"district\":\"海淀区\"}}";
UserDetail userDetail = objectMapper.readValue(jsonStr, UserDetail.class);
System.out.println(userDetail);
// 输出:UserDetail{name='李四', hobbies=[阅读, 编程], address=Address{city='北京', district='海淀区'}}
常用注解:灵活映射JSON结构
Jackson提供了丰富的注解,用于处理JSON与Java对象之间的结构差异:
@JsonProperty:指定JSON键与Java属性的映射关系(解决键名不一致问题)。@JsonProperty("user_name") private String name; // JSON中的"user_name"会映射到Java的name属性@JsonIgnore:忽略某个属性(不参与序列化/反序列化)。@JsonIgnore private String password; // JSON中不包含password字段
@JsonFormat:格式化日期/时间类型。@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createTime; // JSON中的日期字符串需按指定格式解析
(二)Gson:Google官方库
Gson是Google推出的JSON库,以简洁的API和稳定的性能著称,特别适合处理复杂的JSON结构。
添加依赖
Maven依赖:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version> <!-- 建议使用最新版本 -->
</dependency>
基本使用:JSON字符串转Java对象
Gson的核心类是Gson,通过fromJson()方法实现反序列化。
示例:使用与Jackson相同的User类,转换JSON字符串:
import com.google.gson.Gson;
public class GsonDemo {
public static void main(String[] args) {
String jsonStr = "{\"name\":\"王五\",\"age\":30,\"isStudent\":true}";
Gson gson = new Gson();
// JSON字符串转User对象
User user = gson.fromJson(jsonStr, User.class);
System.out.println(user); // 输出:User{name='王五', age=30, isStudent=true}
}
}
处理复杂JSON与集合
Gson同样支持嵌套对象和集合,无需额外配置,直接定义对应的Java类即可。
示例:转换包含数组的JSON字符串:
String jsonStr = "{\"name\":\"赵六\",\"scores\":[90,85,95]}";
// 假设User类中有List<Integer> scores属性
UserWithScores user = gson.fromJson(jsonStr, UserWithScores.class);
System.out.println(user); // 输出:UserWithScores{name='赵六', scores=[90, 85, 95]}
Gson注解
Gson的注解与Jackson类似,但命名略有不同:
@SerializedName:指定JSON键与Java属性的映射关系(相当于Jackson的@JsonProperty)。@SerializedName("user_name") private String name;@Expose:控制属性是否参与序列化/反序列化(需配合GsonBuilder使用)。@Expose(serialize = false, deserialize = false) private String tempField; // 忽略该字段
(三)Fastjson:阿里巴巴高性能库
Fastjson是阿里巴巴开源的JSON库,以“快”著称,曾是国内Java开发的首选,但近年来因安全漏洞(如1.2.68版本前的反序列化漏洞)逐渐被谨慎使用。
添加依赖
Maven依赖(建议使用1.2.83及以上版本,修复已知漏洞):
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
基本使用:JSON字符串转Java对象
Fastjson的核心类是JSON,通过parseObject()方法实现反序列化。
示例:



还没有评论,来说两句吧...