Java中使用JSON解析的全面指南
在Java开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,因其易读、易解析的特性,被广泛应用于前后端数据交互、配置文件存储、API响应解析等场景,本文将详细介绍Java中如何使用JSON进行解析,涵盖主流库(如Gson、Jackson、org.json)的使用方法、核心功能及实践案例。
JSON与Java的映射关系
JSON数据结构主要有两种形式:对象(Object)和数组(Array),在Java中,JSON对象通常对应Map或自定义类(POJO/JavaBean),JSON数组则对应List或数组类型,理解这种映射关系是JSON解析的基础:
| JSON类型 | Java类型示例 |
|---|---|
| 对象 | Map<String, Object>、自定义类 |
数组 [] |
List<Object>、数组(如String[]) |
| 字符串 | String |
数字 123 |
Integer、Long、Double等 |
布尔 true/false |
Boolean |
空值 null |
null |
主流JSON解析库对比
Java生态中有多种JSON处理库,最常用的包括:
| 库名称 | 维护方 | 特点 | 适用场景 |
|---|---|---|---|
| Gson | 简单易用,支持复杂对象与泛型,无需注解 | 轻量级解析、Android开发 | |
| Jackson | FasterXML | 性能高,功能强大,支持流式解析 | 企业级应用、高性能场景 |
| org.json | JSON.org | 轻量级,API简洁,但功能相对有限 | 简单JSON处理 |
本文将重点介绍Gson和Jackson的使用,兼顾org.json的基础操作。
使用Gson解析JSON
Gson是Google开源的JSON处理库,核心类是com.google.gson.Gson,提供从JSON到Java对象的转换(反序列化)和Java对象到JSON的转换(序列化)。
添加依赖
Maven项目中添加:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version> <!-- 建议使用最新版本 -->
</dependency>
基础解析:JSON字符串转Java对象
(1)简单JSON转基本类型/字符串
import com.google.gson.Gson;
public class GsonBasicParse {
public static void main(String[] args) {
String jsonStr = "\"name\":\"张三\",\"age\":25,\"isStudent\":true";
Gson gson = new Gson();
String name = gson.fromJson(jsonStr, String.class); // 解析JSON字符串字段
int age = gson.fromJson(jsonStr, int.class); // 解析JSON数字字段
boolean isStudent = gson.fromJson(jsonStr, boolean.class); // 解析JSON布尔字段
System.out.println("姓名: " + name); // 输出: 姓名: 张三
System.out.println("年龄: " + age); // 输出: 年龄: 25
System.out.println("是否学生: " + isStudent); // 输出: 是否学生: true
}
}
(2)JSON对象转自定义类(POJO)
定义Java类与JSON字段对应:
public class User {
private String name;
private int age;
private boolean isStudent;
// 无参构造器(Gson反序列化时需要)
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字符串到User对象:
import com.google.gson.Gson;
public class GsonPojoParse {
public static void main(String[] args) {
String jsonStr = "{\"name\":\"李四\",\"age\":22,\"isStudent\":true}";
Gson gson = new Gson();
User user = gson.fromJson(jsonStr, User.class);
System.out.println(user); // 输出: User{name='李四', age=22, isStudent=true}
}
}
(3)JSON数组转List
import com.google.gson.Gson;
import java.util.List;
public class GsonListParse {
public static void main(String[] args) {
String jsonArrayStr = "[{\"name\":\"王五\",\"age\":20},{\"name\":\"赵六\",\"age\":23}]";
Gson gson = new Gson();
// 使用TypeToken指定List泛型类型
List<User> userList = gson.fromJson(jsonArrayStr, new TypeToken<List<User>>() {}.getType());
userList.forEach(System.out::println);
/* 输出:
User{name='王五', age=20, isStudent=false}
User{name='赵六', age=23, isStudent=false}
*/
}
}
高级功能:自定义解析与注解
(1)字段映射注解
@SerializedName:解决JSON字段名与Java字段名不一致的问题。public class User { @SerializedName("username") // JSON字段为"username",Java字段为"name" private String name; // 其他字段... }
(2)日期格式处理
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.util.Date;
public class GsonDateParse {
public static void main(String[] args) {
String jsonStr = "{\"name\":\"陈七\",\"birthDate\":\"1995-08-10\"}";
// 创建Gson实例并注册日期格式
Gson gson = new GsonBuilder()
.setDateFormat("yyyy-MM-dd") // 指定日期格式
.create();
User user = gson.fromJson(jsonStr, User.class);
System.out.println(user.getBirthDate()); // 输出: Sun Aug 10 00:00:00 CST 1995
}
}
使用Jackson解析JSON
Jackson是高性能的JSON处理库,核心类是com.fasterxml.jackson.databind.ObjectMapper,功能更全面,支持流式解析、树模型等高级特性。
添加依赖
Maven项目中添加:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version> <!-- 建议使用最新版本 -->
</dependency>
基础解析:JSON字符串转Java对象
(1)简单JSON转基本类型
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonBasicParse {
public static void main(String[] args) throws Exception {
String jsonStr = "\"message\":\"操作成功\",\"code\":200";
ObjectMapper mapper = new ObjectMapper();
String message = mapper.readValue(jsonStr, String.class);
int code = mapper.readValue(jsonStr, int.class);
System.out.println("消息: " + message); // 输出: 消息: 操作成功
System.out.println("状态码: " + code); // 输出: 状态码: 200
}
}
(2)JSON对象转自定义类
与Gson类似,Jackson会自动匹配JSON字段与Java类的字段名(驼峰命名):
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonPojoParse {
public static void main(String[] args) throws Exception {
String jsonStr = "{\"name\":\"周八\",\"age\":21,\"isStudent\":false}";
ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(jsonStr, User.class);
System.out.println(user); // 输出: User{name='周八', age=21, isStudent=false}
}
}
(3)JSON数组转List
使用TypeReference指定泛型类型:
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
public class JacksonListParse {
public static void main(String[] args) throws Exception {
String jsonArrayStr = "[{\"name\":\"吴九\",\"age\":19},{\"name\":\"郑十\",\"age\":24}]";
ObjectMapper mapper = new ObjectMapper();
List<User> userList = mapper.readValue(
jsonArrayStr,
new TypeReference<List<User>>() {}
);
userList.forEach(System.out::println);
}
}



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