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):直接通过构造函数解析
抖音足球直播
抖音足球直播
企鹅直播
企鹅直播
足球直播
爱奇艺直播
爱奇艺足球直播
足球直播
足球直播
iqiyi直播
足球直播
足球直播
QQ足球直播
QQ足球直播
足球直播
足球直播
QQ足球直播
QQ足球直播
足球直播
足球直播
快连
快连
快连
快连下载
快连
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
新浪足球直播
新浪足球直播
足球直播
足球直播
有道翻译
有道翻译
有道翻译
有道翻译
wps
wps
wps
wps
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
新浪足球直播
新浪足球直播
足球直播
足球直播



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