Java如何提取JSON数据:全面指南与实践
在Java开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,因其易读性和灵活性被广泛应用于前后端数据交互、配置文件存储等场景,如何在Java中提取JSON数据,是开发者必备的技能,本文将详细介绍Java中提取JSON数据的多种方法,从原生API到第三方库,结合代码示例与实践技巧,帮助你高效处理JSON数据。
JSON数据基础:结构认知
在提取数据前,需先理解JSON的基本结构:
- 对象(Object):无序键值对集合,用包裹,如
{"name":"张三", "age":25}。 - 数组(Array):有序值列表,用
[]包裹,如[{"name":"李四"}, {"name":"王五"}]。 - 值(Value):可以是字符串、数字、布尔值、null、对象或数组。
提取JSON数据的核心,就是根据上述结构,逐层获取目标值。
使用原生Java API提取JSON(JDK 11+)
Java 11及更高版本内置了javax.json包(JSON Processing API),无需额外依赖即可处理JSON,虽然功能不如第三方库强大,但适合简单场景或不想引入第三方依赖时使用。
解析JSON对象
import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonReader;
import java.io.StringReader;
public class Json原生提取示例 {
public static void main(String[] args) {
String jsonStr = "{\"name\":\"张三\", \"age\":25, \"isStudent\":true}";
try (JsonReader reader = Json.createReader(new StringReader(jsonStr))) {
JsonObject jsonObject = reader.readObject(); // 读取JSON对象
// 提取字符串
String name = jsonObject.getString("name");
System.out.println("姓名: " + name); // 输出: 姓名: 张三
// 提取数字(getInt()适用于整数,getJsonNumber()更灵活)
int age = jsonObject.getInt("age");
System.out.println("年龄: " + age); // 输出: 年龄: 25
// 提取布尔值
boolean isStudent = jsonObject.getBoolean("isStudent");
System.out.println("是否学生: " + isStudent); // 输出: 是否学生: true
}
}
}
解析JSON数组
import javax.json.Json;
import javax.json.JsonArray;
import javax.json.JsonReader;
import java.io.StringReader;
public class Json数组提取示例 {
public static void main(String[] args) {
String jsonStr = "[{\"name\":\"李四\", \"age\":30}, {\"name\":\"王五\", \"age\":28}]";
try (JsonReader reader = Json.createReader(new StringReader(jsonStr))) {
JsonArray jsonArray = reader.readArray(); // 读取JSON数组
// 遍历数组,提取每个对象的数据
for (int i = 0; i < jsonArray.size(); i++) {
JsonObject item = jsonArray.getJsonObject(i);
String name = item.getString("name");
int age = item.getInt("age");
System.out.println("用户" + (i+1) + ": " + name + ", " + age + "岁");
}
}
}
}
处理嵌套JSON
import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonReader;
import java.io.StringReader;
public class 嵌套Json提取示例 {
public static void main(String[] args) {
String jsonStr = "{\"name\":\"赵六\", \"address\":{\"city\":\"北京\", \"district\":\"朝阳区\"}}";
try (JsonReader reader = Json.createReader(new StringReader(jsonStr))) {
JsonObject jsonObject = reader.readObject();
// 提取嵌套对象
JsonObject address = jsonObject.getJsonObject("address");
String city = address.getString("city");
String district = address.getString("district");
System.out.println("地址: " + city + " " + district); // 输出: 地址: 北京 朝阳区
}
}
}
原生API优缺点:
- 优点:无需依赖,轻量级。
- 缺点:功能有限(如不支持复杂查询、需手动处理异常),代码冗长。
使用Gson提取JSON(Google开源库)
Gson是Google推出的JSON处理库,支持将JSON字符串与Java对象相互转换(序列化/反序列化),适合处理结构化JSON数据。
添加依赖(Maven)
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
基本数据提取
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
public class Gson提取示例 {
public static void main(String[] args) {
String jsonStr = "{\"name\":\"钱七\", \"age\":35, \"hobbies\":[\"阅读\", \"旅行\"]}";
// 解析JSON为JsonElement
JsonElement jsonElement = JsonParser.parseString(jsonStr);
JsonObject jsonObject = jsonElement.getAsJsonObject();
// 提取基本类型
String name = jsonObject.get("name").getAsString();
int age = jsonObject.get("age").getAsInt();
System.out.println("姓名: " + name + ", 年龄: " + age); // 输出: 姓名: 钱七, 年龄: 35
// 提取数组
JsonArray hobbies = jsonObject.getAsJsonArray("hobbies");
System.out.print("爱好: ");
for (JsonElement hobby : hobbies) {
System.out.print(hobby.getAsString() + " "); // 输出: 爱好: 阅读 旅行
}
}
}
反序列化为Java对象(推荐方式)
如果JSON数据结构固定,可定义对应的Java类,通过Gson直接转换为对象,简化数据提取。
import com.google.gson.Gson;
// 定义与JSON结构对应的Java类
class User {
private String name;
private int age;
private String[] hobbies;
// 必须提供无参构造器
public User() {}
// Getter和Setter(或使用Lombok简化)
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 String[] getHobbies() { return hobbies; }
public void setHobbies(String[] hobbies) { this.hobbies = hobbies; }
}
public class Gson反序列化示例 {
public static void main(String[] args) {
String jsonStr = "{\"name\":\"孙八\", \"age\":40, \"hobbies\":[\"游泳\", \"摄影\"]}";
Gson gson = new Gson();
User user = gson.fromJson(jsonStr, User.class); // 直接转为User对象
// 通过对象属性提取数据
System.out.println("姓名: " + user.getName()); // 输出: 姓名: 孙八
System.out.println("年龄: " + user.getAge()); // 输出: 年龄: 40
System.out.print("爱好: ");
for (String hobby : user.getHobbies()) {
System.out.print(hobby + " "); // 输出: 爱好: 游泳 摄影
}
}
}
处理嵌套对象
// 定义嵌套类
class Address {
private String city;
private String district;
// Getter和Setter
}
class UserWithAddress {
private String name;
private Address address;
// Getter和Setter
}
public class Gson嵌套示例 {
public static void main(String[] args) {
String jsonStr = "{\"name\":\"周九\", \"address\":{\"city\":\"上海\", \"district\":\"浦东新区\"}}";
Gson gson = new Gson();
UserWithAddress user = gson.fromJson(jsonStr, UserWithAddress.class);
System.out.println("地址: " + user.getAddress().getCity() + " " +
user.getAddress().getDistrict()); // 输出: 地址: 上海 浦东新区
}
}
Gson优缺点:
- 优点:功能强大,支持复杂对象映射,代码简洁,社区活跃。
- 缺点:需引入第三方依赖,反序列化时需提前定义Java类。
使用Jackson提取JSON(Spring Boot默认库)
Jackson是Java生态中最流行的JSON库,被Spring Boot、Hibernate等框架广泛使用,其性能优异,功能全面,支持流式解析(适合大JSON文件)。
添加依赖(Maven)
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifact


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