如何从JSON中取值:从基础到实践的全面指南
在当今的软件开发中,JSON(JavaScript Object Notation)已成为数据交换的主流格式,无论是调用API接口、配置文件读取,还是前后端数据传输,都离不开JSON的身影,而“如何从JSON中取值”,是每个开发者必须的基础技能,本文将从JSON的基础结构讲起,结合不同编程语言(如Python、JavaScript、Java)的实践案例,带你系统从JSON中提取数据的多种方法。
先搞懂:JSON是什么?它长什么样?
要取值,得先认识JSON的“长相”,JSON是一种轻量级的数据交换格式,采用键值对(Key-Value Pair)的结构组织数据,其核心结构包括两种类型:
对象(Object)
用花括号 包裹,由多个键值对组成,键(Key)必须是字符串(用双引号 包裹),值(Value)可以是字符串、数字、布尔值、数组、对象甚至null,键值对之间用逗号 分隔,
{
"name": "张三",
"age": 25,
"isStudent": false,
"courses": ["数学", "英语"],
"address": {
"city": "北京",
"district": "海淀区"
}
}
数组(Array)
用方括号 [] 包裹,由多个值(Value)组成,值可以是任意JSON支持的类型(包括对象),
[
{"id": 1, "name": "苹果"},
{"id": 2, "name": "香蕉"},
{"id": 3, "name": "橙子"}
]
核心思路:从JSON中取值的通用逻辑
无论用哪种编程语言,从JSON中取值的核心逻辑都是“先解析,后访问”:
- 解析JSON:将JSON格式的字符串(或文件)转换成编程语言中的原生数据结构(如Python的字典/列表、JavaScript的对象/数组、Java的JSONObject/List等)。
- 访问数据:通过键(对象)或索引(数组)的方式,从解析后的数据结构中提取目标值。
实践操作:不同语言如何从JSON取值?
Python:用 json 模块轻松解析
Python内置了 json 模块,专门用于JSON数据的解析和生成。
场景1:解析简单JSON对象(字典)
假设有JSON字符串 json_str:
import json
json_str = '{"name": "李四", "age": 30, "city": "上海"}'
data_dict = json.loads(json_str) # 将JSON字符串转为Python字典
# 取值:通过键访问
name = data_dict["name"] # 输出: "李四"
age = data_dict["age"] # 输出: 30
print(f"姓名: {name}, 年龄: {age}")
场景2:解析嵌套JSON
如果JSON包含嵌套对象或数组,通过“链式调用”取值:
json_str = '''
{
"user": "王五",
"scores": [85, 90, 78],
"info": {"gender": "男", "email": "wangwu@example.com"}
}
'''
data = json.loads(json_str)
# 取嵌套对象的值
gender = data["info"]["gender"] # 输出: "男"
email = data["info"]["email"] # 输出: "wangwu@example.com"
# 取数组中的值(通过索引)
first_score = data["scores"][0] # 输出: 85
场景3:处理JSON文件
如果数据存储在JSON文件(如 data.json)中,用 json.load() 直接读取:
with open("data.json", "r", encoding="utf-8") as f:
data = json.load(f) # 从文件流解析JSON
print(data["name"]) # 直接访问文件中的数据
注意事项:
- 如果键不存在,直接访问会抛出
KeyError,建议用dict.get(key, default_value)安全取值(如data.get("phone", "未设置"))。 - JSON的键必须是双引号,Python单引号会导致解析失败。
JavaScript:原生API与JSON对象双管齐下
JavaScript作为JSON的“出身语言”,处理JSON非常便捷。
场景1:解析JSON字符串
用 JSON.parse() 将JSON字符串转为JavaScript对象:
let jsonStr = '{"name": "赵六", "age": 28, "hobbies": ["编程", "摄影"]}';
let dataObj = JSON.parse(jsonStr); // 转为JS对象
// 取值:通过点号或方括号访问
let name = dataObj.name; // 输出: "赵六"
let age = dataObj["age"]; // 输出: 28
let firstHobby = dataObj.hobbies[0]; // 输出: "编程"
场景2:解析嵌套JSON
链式访问嵌套结构,与Python类似:
let jsonStr = `
{
"product": "手机",
"specs": {"color": "黑色", "storage": "128GB"},
"prices": [4999, 5299, 5599]
}
`;
let data = JSON.parse(jsonStr);
let color = data.specs.color; // 输出: "黑色"
let lastPrice = data.prices[2]; // 输出: 5599
场景3:将对象转为JSON字符串
如果需要反向操作(如将对象转为JSON字符串),用 JSON.stringify():
let obj = {name: "钱七", age: 35};
let jsonStr = JSON.stringify(obj); // 输出: '{"name":"钱七","age":35}'
注意事项:
JSON.parse()要求字符串必须是严格的JSON格式(键必须双引号),否则会抛出SyntaxError。- 访问不存在的属性返回
undefined,可通过 可选链避免报错(如data?.specs?.color)。
Java:用 org.json 或 Jackson/Gson 库
Java本身没有内置JSON解析类,需借助第三方库(如 org.json、Jackson、Gson),这里以轻量级的 org.json 为例。
场景1:解析JSON字符串
先添加依赖(Maven):
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20231013</version>
</dependency>
代码示例:
import org.json.JSONObject;
public class JsonDemo {
public static void main(String[] args) {
String jsonStr = "{\"name\": \"孙八\", \"age\": 40, \"city\": \"广州\"}";
JSONObject jsonObj = new JSONObject(jsonStr); // 转为JSONObject对象
// 取值:用getString()、getInt()等方法
String name = jsonObj.getString("name"); // 输出: "孙八"
int age = jsonObj.getInt("age"); // 输出: 40
System.out.println("姓名: " + name + ", 年龄: " + age);
}
}
场景2:解析嵌套JSON
通过 getJSONObject() 和 getJSONArray() 处理嵌套结构:
String jsonStr = """
{
"student": "周九",
"scores": [92, 88, 95],
"contact": {"phone": "13800138000", "address": "深圳"}
}
""";
JSONObject data = new JSONObject(jsonStr);
// 取嵌套对象
String phone = data.getJSONObject("contact").getString("phone"); // 输出: "13800138000"
// 取数组
int secondScore = data.getJSONArray("scores").getInt(1); // 输出: 88
场景3:处理JSON数组
如果JSON是数组格式,用 JSONArray 解析:
String jsonArrayStr = "[{\"id\": 1}, {\"id\": 2}]";
JSONArray jsonArray = new JSONArray(jsonArrayStr);
for (int i = 0; i < jsonArray.length(); i++) {
int id = jsonArray.getJSONObject(i).getInt("id");
System.out.println("ID: " + id);
}
注意事项:
org.json提供了类型明确的取值方法(如getString()、getInt()),若类型不匹配会抛出异常。- 更复杂的场景推荐使用
Jackson或Gson,它们支持将JSON直接转为Java对象(反序列化)。



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