JSON中的提取是怎么用:从入门到实践
在数据交互的世界里,JSON(JavaScript Object Notation)以其轻量、易读、易解析的特性,已成为前后端通信、API数据交换、配置文件存储等场景的“通用语言”,但拿到JSON数据后,如何高效、准确地提取所需信息,是开发者必须的核心技能,本文将从JSON的基础结构讲起,结合实例和代码,带你彻底搞懂“JSON中的提取是怎么用”。
先搞懂:JSON长什么样?提取前的基础认知
要提取JSON数据,得先认识它的“长相”,JSON本质上是一种键值对(Key-Value Pair)的数据结构,主要有两种形式:
对象(Object):用 包裹,键值对集合
类似Python中的字典、Java中的Map,由多个“键:值”对组成,键必须是字符串(双引号包裹),值可以是多种类型。
示例:
{
"name": "张三",
"age": 25,
"isStudent": false,
"courses": ["数学", "英语"],
"address": {
"city": "北京",
"district": "海淀区"
}
}
数组(Array):用 [] 包裹,有序值列表
类似Python中的列表、Java中的数组,可以存储多个值(值可以是对象、数组、基本类型等)。
示例:
[
{"id": 1, "product": "手机", "price": 2999},
{"id": 2, "product": "电脑", "price": 5999},
{"id": 3, "product": "平板", "price": 1999}
]
核心规则:
- 键(Key)必须是字符串,且用双引号()包裹(单引号会报错);
- 值(Value)可以是6种类型:字符串、数字、布尔值(
true/false)、null、数组、对象; - 数据结构可以嵌套(对象里套对象、数组里套对象等)。
JSON数据提取的3种核心场景及方法
提取JSON数据的核心思路是:通过“键”定位值,通过“索引”定位数组元素,逐层嵌套结构,下面结合不同编程语言,讲解最常见的3种提取场景。
场景1:提取简单对象的键值对(无嵌套、无数组)
当JSON是“扁平化”的对象(不包含嵌套对象或数组)时,提取最简单——直接通过键名获取值。
▶ Python:用字典方式访问
Python的json库可将JSON字符串解析为字典,直接通过键名取值:
import json
# JSON字符串
json_str = '{"name": "李四", "age": 30, "job": "工程师"}'
# 解析为字典
data = json.loads(json_str)
# 提取值
name = data["name"] # 直接通过键名
age = data.get("age") # 用get方法,键不存在时返回None(避免报错)
job = data.get("salary", "未填写") # 指定默认值,键不存在时返回默认值
print(f"姓名:{name}, 年龄:{age}, 职业:{job}")
# 输出:姓名:李四, 年龄:30, 职业:未填写
▶ JavaScript:用点语法或方括号访问
前端或Node.js中,JSON对象可直接通过对象.键名或对象["键名"]访问:
// JSON对象(直接定义,无需额外解析)
const data = {
"name": "王五",
"age": 28,
"city": "上海"
};
// 提取值
const name = data.name; // 点语法
const age = data["age"]; // 方括号语法(键名含特殊字符时必须用)
const city = data?.country ?? "未知"; // 可选链(?.)+ 空值合并(??),避免报错
console.log(`姓名:${name}, 年龄:${age}, 城市:${city}`);
// 输出:姓名:王五, 年龄:28, 城市:未知
▶ Java:用JSONObject类(需引入依赖)
Java中常用org.json库(或Jackson、Gson),通过getString()、getInt()等方法按类型取值:
import org.json.JSONObject;
// JSON字符串
String jsonStr = "{\"name\": \"赵六\", \"score\": 95.5}";
// 解析为JSONObject
JSONObject data = new JSONObject(jsonStr);
// 提取值(需指定类型,不匹配会抛异常)
String name = data.getString("name");
double score = data.getDouble("score");
int age = data.optInt("age", 0); // optInt方法,键不存在时返回默认值0
System.out.println("姓名:" + name + ", 分数:" + score + ", 年龄:" + age);
// 输出:姓名:赵六, 分数:95.5, 年龄:0
场景2:提取数组中的元素(列表数据)
当JSON是数组时,需通过索引(从0开始)定位元素,再结合场景1的方法提取值。
▶ Python:遍历数组或按索引取值
import json
# JSON数组字符串
json_str = '[{"id": 1, "name": "苹果"}, {"id": 2, "name": "香蕉"}]'
data = json.loads(json_str)
# 方法1:按索引取单个元素(第一个元素索引0)
first_fruit = data[0]
print(f"第一个水果:{first_fruit['name']}") # 输出:第一个水果:苹果
# 方法2:遍历数组,提取所有元素名称
for fruit in data:
print(fruit["name"]) # 输出:苹果、香蕉
# 方法3:列表推导式(提取所有id)
ids = [item["id"] for item in data]
print(f"水果ID列表:{ids}") # 输出:水果ID列表:[1, 2]
▶ JavaScript:用forEach或map遍历
// JSON数组
const data = [
{id: 1, name: "咖啡", price: 25},
{id: 2, name: "奶茶", price: 18},
{id: 3, name: "果汁", price: 22}
];
// 方法1:forEach遍历(直接操作)
data.forEach(item => {
console.log(`${item.name}:${item.price}元`);
});
// 方法2:map提取新数组(提取所有商品名)
const names = data.map(item => item.name);
console.log("商品名列表:", names); // 输出:商品名列表:["咖啡", "奶茶", "果汁"]
// 方法3:find查找符合条件的元素(查找价格为18的商品)
const cheapItem = data.find(item => item.price === 18);
console.log("低价商品:", cheapItem); // 输出:低价商品:{id: 2, name: "奶茶", price: 18}
▶ Java:用JSONArray遍历
import org.json.JSONArray;
import org.json.JSONObject;
// JSON数组字符串
String jsonStr = "[{\"id\": 1, \"task\": \"写代码\"}, {\"id\": 2, \"task\": \"测试\"}]";
JSONArray data = new JSONArray(jsonStr);
// 遍历数组
for (int i = 0; i < data.length(); i++) {
JSONObject item = data.getJSONObject(i); // 取出每个元素(JSONObject)
int id = item.getInt("id");
String task = item.getString("task");
System.out.println("任务" + id + ":" + task);
}
// 输出:任务1:写代码、任务2:测试
场景3:提取嵌套结构中的数据(对象套对象/数组)
实际数据中,嵌套结构非常常见(如“用户信息”嵌套“地址”,“订单列表”嵌套“商品详情”),提取时需逐层定位,从外到内按“键→索引→键→索引”的顺序访问。
▶ Python:层层“剥洋葱”
import json
# 嵌套JSON字符串(对象里套对象+数组)
json_str = '''
{
"user": {
"id": 101,
"name": "陈七",
"contacts": {
"email": "chenqi@example.com",
"phones": ["13800138000", "13900139000"]
}
},
"orders": [
{"order_id": "A001", "amount": 199},
{"order_id": "B002", "amount": 299}
]
}
'''
data = json.loads(json_str)
#


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