Java如何从JSON中提取数据:全面指南
在Java开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,被广泛应用于前后端数据交互、配置文件存储、API响应解析等场景,从JSON中提取数据的方法,是Java开发者的必备技能,本文将详细介绍Java中处理JSON的常用库、核心方法及实战代码,帮助你高效地从JSON中获取所需数据。
Java中处理JSON的常用库
在Java生态中,有多种JSON处理库可供选择,以下是几种主流库及其特点:
Jackson
- 特点:高性能、功能全面,支持JSON与Java对象的相互转换(序列化/反序列化),是Spring Framework默认的JSON处理库。
- 依赖(Maven):
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> </dependency>
Gson
- 特点:Google开发,简单易用,专注于JSON与Java对象的转换,无需注解即可实现复杂映射。
- 依赖(Maven):
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.10.1</version> </dependency>
org.json
- 特点:轻量级,API简洁,适合直接操作JSON字符串或构建JSON对象。
- 依赖(Maven):
<dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20231013</version> </dependency>
JSON-P & JSON-P (Java API for JSON Processing)
- 特点:Java EE标准,提供低级别的JSON解析和生成API,适合手动处理JSON结构。
- 依赖(Java 11+已内置,早期版本需单独引入)。
从JSON中提取数据的实战方法
场景设定
假设我们有以下JSON字符串,后续示例将基于此展开:
{
"name": "张三",
"age": 25,
"isStudent": false,
"courses": [
{"courseName": "数学", "score": 90},
{"courseName": "英语", "score": 85}
],
"address": {
"city": "北京",
"district": "海淀区"
},
"contactInfo": {
"phone": "13800138000",
"email": "zhangsan@example.com"
}
}
方法1:使用Jackson(推荐,适合复杂对象映射)
步骤1:定义Java类(POJO)
根据JSON结构创建对应的Java类,便于反序列化:
public class Person {
private String name;
private int age;
private boolean isStudent;
private List<Course> courses;
private Address address;
private ContactInfo contactInfo;
// getters & setters
// 内部类
public static class Course {
private String courseName;
private int score;
// getters & setters
}
public static class Address {
private String city;
private String district;
// getters & setters
}
public static class ContactInfo {
private String phone;
private String email;
// getters & setters
}
}
步骤2:解析JSON并提取数据
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonExample {
public static void main(String[] args) throws Exception {
String json = "{...}"; // 上述JSON字符串
ObjectMapper objectMapper = new ObjectMapper();
Person person = objectMapper.readValue(json, Person.class);
// 提取基本类型数据
System.out.println("姓名: " + person.getName()); // 张三
System.out.println("年龄: " + person.getAge()); // 25
// 提取布尔值
System.out.println("是否学生: " + person.isStudent()); // false
// 提取数组/列表数据
List<Course> courses = person.getCourses();
courses.forEach(course ->
System.out.println("课程: " + course.getCourseName() + ", 分数: " + course.getScore())
);
// 输出:课程: 数学, 分数: 90;课程: 英语, 分数: 85
// 提取嵌套对象数据
Address address = person.getAddress();
System.out.println("地址: " + address.getCity() + " " + address.getDistrict()); // 北京 海淀区
// 提取嵌套对象中的字段
ContactInfo contactInfo = person.getContactInfo();
System.out.println("电话: " + contactInfo.getPhone()); // 13800138000
}
}
关键点:
objectMapper.readValue(json, Person.class):将JSON字符串反序列化为Java对象。- 通过POJO的getter方法提取数据,适合结构固定的JSON。
方法2:使用Gson(简单易用,无需复杂POJO)
步骤1:直接解析JSON为JsonObject
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
public class GsonExample {
public static void main(String[] args) {
String json = "{...}"; // 上述JSON字符串
JsonParser parser = new JsonParser();
JsonObject jsonObject = parser.parse(json).getAsJsonObject();
// 提取基本类型数据(注意类型转换)
String name = jsonObject.get("name").getAsString();
int age = jsonObject.get("age").getAsInt();
boolean isStudent = jsonObject.get("isStudent").getAsBoolean();
System.out.println("姓名: " + name); // 张三
System.out.println("年龄: " + age); // 25
System.out.println("是否学生: " + isStudent); // false
// 提取数组数据(JsonArray)
JsonArray coursesArray = jsonObject.getAsJsonArray("courses");
for (JsonElement courseElement : coursesArray) {
JsonObject courseObj = courseElement.getAsJsonObject();
String courseName = courseObj.get("courseName").getAsString();
int score = courseObj.get("score").getAsInt();
System.out.println("课程: " + courseName + ", 分数: " + score);
}
// 提取嵌套对象
JsonObject addressObj = jsonObject.getAsJsonObject("address");
String city = addressObj.get("city").getAsString();
String district = addressObj.get("district").getAsString();
System.out.println("地址: " + city + " " + district); // 北京 海淀区
// 提取嵌套对象中的字段
JsonObject contactObj = jsonObject.getAsJsonObject("contactInfo");
String phone = contactObj.get("phone").getAsString();
System.out.println("电话: " + phone); // 13800138000
}
}
关键点:
JsonParser.parse(json).getAsJsonObject():将JSON字符串解析为JsonObject。- 通过
get("key")获取值,再调用getAsString()/getAsInt()等方法转换类型。 - 适合结构灵活或仅需部分数据的场景,无需定义完整POJO。
方法3:使用org.json(轻量级,直接操作)
步骤1:解析JSON为JSONObject
import org.json.JSONArray;
import org.json.JSONObject;
public class OrgJsonExample {
public static void main(String[] args) {
String json = "{...}"; // 上述JSON字符串
JSONObject jsonObject = new JSONObject(json);
// 提取基本类型数据
String name = jsonObject.getString("name");
int age = jsonObject.getInt("age");
boolean isStudent = jsonObject.getBoolean("isStudent");
System.out.println("姓名: " + name); // 张三
System.out.println("年龄: " + age); // 25
System.out.println("是否学生: " + isStudent); // false
// 提取数组数据(JSONArray)
JSONArray coursesArray = jsonObject.getJSONArray("courses");
for (int i = 0; i < coursesArray.length(); i++) {
JSONObject courseObj = coursesArray.getJSONObject(i);
String courseName = courseObj.getString("courseName");
int score = courseObj.getInt("score");
System.out.println("课程: " + courseName + ", 分数: " + score);
}
// 提取嵌套对象
JSONObject addressObj = jsonObject.getJSONObject("address");
String city = addressObj.getString("city");
String district = addressObj.getString("district");
System.out.println("地址: " + city + " " + district); // 北京 海淀区
// 提取嵌套对象中的字段
JSONObject contactObj = jsonObject.getJSONObject("contactInfo");
String phone = contactObj.getString("phone");
System.out.println("电话: " + phone); // 13800138000
}
}
关键点:
new JSONObject(json):直接通过构造函数解析



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