如何轻松取出JSON里面的数据:从基础到进阶指南
JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,因其易读、易解析的特性,已成为Web开发、API交互、数据存储等场景中的“通用语言”,无论是前端获取后端接口数据,还是处理配置文件、分析日志,我们都不可避免地需要从JSON结构中提取所需信息,本文将从JSON的基础结构讲起,结合不同编程语言的实践,带你彻底“如何取出JSON里面的数据”。
先搞懂:JSON到底是什么?
要取出JSON数据,得先认识它的“长相”,JSON本质上是一种键值对(Key-Value Pair)的集合,结构上分为两种:
对象(Object)
用 包裹,由多个键值对组成,键(Key)必须是字符串(需用双引号 包裹),值(Value)可以是字符串、数字、布尔值、数组、对象甚至null。
{
"name": "张三",
"age": 25,
"isStudent": false,
"courses": ["数学", "英语"],
"address": {
"city": "北京",
"district": "海淀区"
}
}
数组(Array)
用 [] 包裹,按顺序排列多个值,值可以是任意JSON数据类型(包括对象)。
[
{"id": 1, "name": "苹果"},
{"id": 2, "name": "香蕉"},
{"id": 3, "name": "橙子"}
]
核心规则:
- 键唯一,值可重复;
- 数据结构可以无限嵌套(对象里套对象、数组里套对象等);
- 严格区分类型(如
"25"是字符串,25是数字)。
取出JSON数据的核心方法:按路径“逐层访问”
取出JSON数据的核心思路是“路径访问”:从根节点开始,通过键(对象)或索引(数组)逐层定位目标数据,无论是哪种编程语言,本质都是“先解析,再访问”。
前端:JavaScript/TypeScript 原生操作
JavaScript作为JSON的“母语”,处理JSON数据最直接。
(1)解析JSON字符串为JS对象
如果数据是JSON字符串(如从API获取的响应文本),需先用 JSON.parse() 转换为JS对象/数组:
const jsonString = '{"name": "李四", "age": 30, "hobbies": ["读书", "跑步"]}';
const data = JSON.parse(jsonString); // 转换为JS对象
console.log(data.name); // 输出: 李四
(2)逐层访问数据
- 访问对象属性:用点()或方括号(
[])语法(键需加引号):console.log(data.name); // 点语法: 输出 "李四" console.log(data["age"]); // 方括号语法: 输出 30
- 访问数组元素:用索引(从0开始):
console.log(data.hobbies[0]); // 输出 "读书"
- 嵌套访问:多层结构逐层“点”下去:
const nestedJson = '{"user": {"name": "王五", "contact": {"email": "wangwu@example.com"}}}'; const nestedData = JSON.parse(nestedJson); console.log(nestedData.user.contact.email); // 输出 "wangwu@example.com"
(3)处理动态键/不存在的键
-
动态键(变量存储键名)必须用方括号语法:
const key = "hobbies"; console.log(data[key]); // 输出 ["读书", "跑步"],不能用 data.key
-
安全访问:避免因“键不存在”报错,可用可选链(,ES2020+)或
&&判断:// 可选链:键不存在时返回 undefined,不会报错 console.log(data.user?.contact?.phone); // 输出 undefined(phone 不存在) // 传统判断 if (data.user && data.user.contact) { console.log(data.user.contact.email); }
后端:Python 操作JSON
Python通过内置的 json 模块处理JSON,核心是 json.loads()(字符串转对象)和 json.dumps()(对象转字符串)。
(1)解析JSON字符串为Python字典
import json
json_string = '{"name": "赵六", "age": 28, "skills": ["Python", "SQL"]}'
data = json.loads(json_string) # 转换为Python字典
print(data["name"]) # 输出: 赵六
(2)逐层访问数据
Python字典用键访问,列表用索引访问,语法与JS类似:
# 访问对象(字典)键
print(data["age"]) # 输出: 28
# 访问数组(列表)元素
print(data["skills"][0]) # 输出: Python
# 嵌套访问
nested_json = '{"user": {"name": "钱七", "info": {"city": "上海"}}}'
nested_data = json.loads(nested_json)
print(nested_data["user"]["info"]["city"]) # 输出: 上海
(3)安全访问:避免KeyError
Python中直接访问不存在的键会抛出 KeyError,可用 get() 方法(返回 None 或默认值)或 try-except:
# get() 方法:键不存在时返回 None(或指定默认值)
print(data.get("gender")) # 输出: None(gender 不存在)
print(data.get("gender", "未知")) # 输出: 未知(指定默认值)
# try-except 捕获异常
try:
print(data["gender"])
except KeyError:
print("键不存在")
其他语言:Java/Go/C# 等快速上手
不同语言处理JSON的库不同,但核心逻辑一致:解析 → 访问。
(1)Java:使用 org.json 或 Gson 库
以 org.json 为例(需引入依赖):
import org.json.JSONObject;
public class JsonExample {
public static void main(String[] args) {
String jsonString = "{\"name\": \"孙八\", \"age\": 35}";
JSONObject data = new JSONObject(jsonString); // 解析为JSONObject
// 访问字符串
String name = data.getString("name"); // 输出: 孙八
// 访问数字
int age = data.getInt("age"); // 输出: 35
// 访问嵌套对象
String nestedJson = "{\"user\": {\"name\": \"周九\"}}";
JSONObject nestedData = new JSONObject(nestedJson);
String userName = nestedData.getJSONObject("user").getString("name"); // 输出: 周九
}
}
(2)Go:使用 encoding/json 库
Go语言将JSON解析为结构体(struct)或map:
package main
import (
"encoding/json"
"fmt"
)
// 定义结构体(字段需大写,外部可访问)
type Person struct {
Name string `json:"name"` // json:"name" 表示JSON键名映射到结构体字段
Age int `json:"age"`
}
func main() {
jsonString := `{"name": "吴十", "age": 40}`
var person Person
// 解析JSON字符串到结构体
err := json.Unmarshal([]byte(jsonString), &person)
if err != nil {
fmt.Println("解析失败:", err)
return
}
fmt.Println(person.Name) // 输出: 吴十
fmt.Println(person.Age) // 输出: 40
// 解析到map
var data map[string]interface{}
json.Unmarshal([]byte(jsonString), &data)
fmt.Println(data["name"]) // 输出: 吴十(interface{}类型需断言)
}
进阶技巧:处理复杂JSON结构
实际场景中,JSON可能包含多层嵌套、动态键、数组对象等复杂结构,此时需要更灵活的取数方法。
遍历数组/对象:批量处理数据
当需要取出数组中所有元素或对象中所有键值时,需用循环遍历。
JavaScript示例:遍历数组和对象
const jsonArray = [
{id: 1, name: "商品A"},
{id: 2, name: "商品B"}
];
// 遍历数组


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