Java读取JSON格式数据的完整指南
在Java开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,因其可读性强、解析方便,已成为前后端数据交互、配置文件存储、API响应等场景的主流选择,本文将详细介绍Java中读取JSON数据的多种方式,从原生解析到第三方库工具,涵盖不同场景下的实践方案,帮助开发者快速JSON数据读取技巧。
JSON数据基础:结构认识
在开始解析之前,需先明确JSON的两种核心结构:
- 对象(Object):无序键值对集合,用包裹,键值格式为
"key": value,如{"name": "张三", "age": 25}。 - 数组(Array):有序值列表,用
[]包裹,值可以是对象、数组、字符串、数字等,如[{"name": "张三"}, {"name": "李四"}]。
理解这两种结构后,才能根据JSON数据类型选择合适的解析方法。
Java原生解析:无需依赖的轻量方案
Java标准库中并未直接提供JSON解析工具,但可通过javax.json(Java EE)或org.json(第三方库,但常被误认为原生)实现,这里以javax.json为例(需Java EE环境,如Tomcat、WildFly等):
添加依赖(非Maven项目需手动导入javax.json.jar)
Maven项目依赖:
<dependency>
<groupId>javax.json</groupId>
<artifactId>javax.json-api</artifactId>
<version>1.1.4</version>
</dependency>
<!-- 实现类(如Jakarta EE) -->
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.json</artifactId>
<version>1.1.4</version>
</dependency>
解析JSON对象(Object)
假设JSON数据为:
{"name": "张三", "age": 25, "isStudent": false}
解析代码:
import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonReader;
import java.io.StringReader;
public class JsonObjectParse {
public static void main(String[] args) {
String jsonStr = "{\"name\": \"张三\", \"age\": 25, \"isStudent\": false}";
try (JsonReader reader = Json.createReader(new StringReader(jsonStr))) {
JsonObject jsonObject = reader.readObject(); // 读取JSON对象
// 获取基本类型数据
String name = jsonObject.getString("name"); // 键不存在会抛出异常
int age = jsonObject.getInt("age");
boolean isStudent = jsonObject.getBoolean("isStudent");
// 处理可能不存在的键(使用containsKey或optXxx方法)
String email = jsonObject.getString("email", "默认邮箱"); // 若键不存在,返回默认值
System.out.println("姓名: " + name);
System.out.println("年龄: " + age);
System.out.println("是否学生: " + isStudent);
System.out.println("邮箱: " + email);
}
}
}
解析JSON数组(Array)
假设JSON数据为:
[{"name": "张三", "age": 25}, {"name": "李四", "age": 30}]
解析代码:
import javax.json.Json;
import javax.json.JsonArray;
import javax.json.JsonReader;
import javax.json.JsonObject;
import java.io.StringReader;
public class JsonArrayParse {
public static void main(String[] args) {
String jsonStr = "[{\"name\": \"张三\", \"age\": 25}, {\"name\": \"李四\", \"age\": 30}]";
try (JsonReader reader = Json.createReader(new StringReader(jsonStr))) {
JsonArray jsonArray = reader.readJsonArray(); // 读取JSON数组
for (int i = 0; i < jsonArray.size(); i++) {
JsonObject jsonObject = jsonArray.getJsonObject(i); // 获取数组中的对象
String name = jsonObject.getString("name");
int age = jsonObject.getInt("age");
System.out.println("用户" + (i + 1) + ": " + name + ", " + age + "岁");
}
}
}
}
原生解析的优缺点
- 优点:无需额外依赖(Java EE环境),适合简单场景。
- 缺点:功能有限(如不支持复杂嵌套、日期转换等),代码冗长,错误处理繁琐(需手动处理键不存在、类型不匹配等异常)。
第三方库解析:更高效的选择
实际开发中,原生解析因功能受限较少使用,更多功能强大、易用的第三方库成为首选,如Gson(Google)、Jackson(Spring Boot默认)、Fastjson(阿里)等。
(一)Gson:Google出品,简洁易用
添加依赖
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
解析JSON为Java对象(反序列化)
定义与JSON结构对应的Java类:
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 + "}";
}
}
解析代码:
import com.google.gson.Gson;
public class GsonParse {
public static void main(String[] args) {
String jsonStr = "{\"name\": \"张三\", \"age\": 25, \"isStudent\": false}";
Gson gson = new Gson();
User user = gson.fromJson(jsonStr, User.class); // 直接转为User对象
System.out.println(user); // 输出: User{name='张三', age=25, isStudent=false}
}
}
解析JSON为List集合
假设JSON数组为:[{"name": "张三", "age": 25}, {"name": "李四", "age": 30}]
解析代码:
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.List;
public class GsonListParse {
public static void main(String[] args) {
String jsonStr = "[{\"name\": \"张三\", \"age\": 25}, {\"name\": \"李四\", \"age\": 30}]";
Gson gson = new Gson();
// 使用TypeToken指定List泛型类型
Type userListType = new TypeToken<List<User>>() {}.getType();
List<User> userList = gson.fromJson(jsonStr, userListType);
userList.forEach(System.out::println);
}
}
处理复杂嵌套JSON
假设JSON数据为:
{
"name": "张三",
"hobbies": ["篮球", "编程"],
"address": {
"city": "北京",
"street": "朝阳区xxx街道"
}
}
定义嵌套类:
public class Address {
private String city;
private String street;
// getter/setter
@Override
public String toString() {
return "Address{city='" + city + "', street='" + street + "'}";
}
}
public class ComplexUser {
private String name;
private List<String> hobbies;
private Address address;
// getter/setter
@Override
public String toString() {
return "ComplexUser{name='" + name + "', hobbies=" + hobbies + ", address=" + address + "}";
}
}
解析代码:
import com.google.gson.Gson;
public class GsonComplexParse {
public static void main(String[] args) {
String jsonStr = "{\"name\": \"张三\", \"hobbies\": [\"篮球\", \"编程\"], \"address\": {\"city\": \"北京\", \"street\": \"朝阳区xxx街道\"}}";
Gson gson = new Gson();
ComplexUser user = gson.fromJson(jsonStr, ComplexUser.class);
System.out.println(user);
}
}
(二)Jackson:Spring Boot生态标配,功能强大
添加依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind


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