如何遍历一个JSON串:从基础到实践
在数据交互日益频繁的今天,JSON(JavaScript Object Notation)已成为前后端数据交换的主流格式之一,无论是从API接口获取数据,还是解析配置文件,遍历JSON串都是开发者必须的核心技能,本文将从JSON的基础结构出发,详细介绍遍历JSON串的多种方法,涵盖不同编程语言场景,并附实用示例,助你轻松遍历技巧。
先搞懂:JSON串的基础结构
要遍历JSON,首先要明确它的数据结构,JSON本质上是一种轻量级的数据交换格式,采用键值对(Key-Value Pair)的形式组织数据,其核心结构包括两种类型:
对象(Object)
用 包裹,由无序的键值对组成,键(Key)必须是字符串(需用双引号 包裹),值(Value)可以是任意类型(字符串、数字、布尔值、数组、对象等)。
示例:
{
"name": "张三",
"age": 25,
"isStudent": false,
"address": {
"city": "北京",
"district": "海淀区"
}
}
数组(Array)
用 [] 包裹,由有序的值列表组成,值可以是任意类型(包括对象和数组)。
示例:
[
{"id": 1, "product": "手机", "price": 2999},
{"id": 2, "product": "电脑", "price": 5999},
{"id": 3, "product": "平板", "price": 1999}
]
关键点:JSON串的本质是“嵌套结构”——对象中可以嵌套对象或数组,数组中也可以嵌套对象或数组,形成复杂的树形结构,遍历的核心就是“逐层访问”这些嵌套的键和值。
遍历JSON串的通用思路
无论使用哪种编程语言,遍历JSON串的核心思路可以总结为三步:
解析JSON串为原生数据结构
大多数编程语言都提供“JSON解析器”,能将JSON格式的字符串(如 "{\"name\":\"张三\"}")转换为语言原生的数据结构(如Python的字典、Java的Map、JavaScript的对象等),这一步是遍历的前提,因为直接操作字符串难以处理嵌套结构。
根据数据类型选择遍历方式
- 如果顶层是对象:遍历其所有键(Key),再通过键获取对应的值(Value),若值仍是对象或数组,则递归遍历。
- 如果顶层是数组:遍历每个元素(下标从0开始),若元素是对象或数组,则递归遍历。
处理嵌套结构
通过递归(或循环)处理多层嵌套:每次遇到对象或数组时,重复上述遍历逻辑,直到访问到基本类型(如字符串、数字、布尔值等)。
不同语言下的遍历实践
JavaScript:原生遍历与Lodash辅助
JavaScript作为JSON的“出身语言”,遍历JSON最为便捷,假设有以下JSON串(字符串形式):
const jsonString = `{
"name": "李四",
"hobbies": ["篮球", "编程"],
"family": {
"father": "李明",
"mother": "王芳"
}
}`;
(1)解析JSON为对象
使用 JSON.parse() 将字符串转为JavaScript对象:
const jsonObj = JSON.parse(jsonString);
(2)遍历对象:for...in 循环
for...in 用于遍历对象的可枚举属性(键):
for (let key in jsonObj) {
if (jsonObj.hasOwnProperty(key)) { // 排除原型链上的属性
console.log(`键: ${key}, 值:`, jsonObj[key]);
}
}
// 输出:
// 键: name, 值: 李四
// 键: hobbies, 值: ["篮球", "编程"]
// 键: family, 值: { father: "李明", mother: "王芳" }
(3)遍历数组:forEach 或 for...of
若JSON顶层是数组(如商品列表示例),可直接用数组方法遍历:
const jsonArray = [
{id: 1, product: "手机", price: 2999},
{id: 2, product: "电脑", price: 5999}
];
jsonArray.forEach((item, index) => {
console.log(`元素${index}:`, item);
// 若item是对象,可继续遍历其键
for (let key in item) {
console.log(` - ${key}: ${item[key]}`);
}
});
(4)递归遍历嵌套结构
对于复杂的嵌套JSON,可用递归函数“深度遍历”:
function deepTraverse(obj) {
if (typeof obj !== 'object' || obj === null) {
// 基本类型,直接返回
return obj;
}
if (Array.isArray(obj)) {
// 数组:遍历每个元素
obj.forEach((item, index) => {
console.log(`数组元素${index}:`, deepTraverse(item));
});
} else {
// 对象:遍历每个键
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
console.log(`对象键: ${key}`, deepTraverse(obj[key]));
}
}
}
}
deepTraverse(jsonObj);
(5)使用Lodash简化遍历
Lodash是JavaScript工具库,提供 _.forEach 和 _.map 等方法,能自动处理嵌套结构:
const _ = require('lodash');
_.forEach(jsonObj, (value, key) => {
console.log(`${key}:`, value);
});
Python:字典与列表的遍历
Python中,JSON串可通过 json 模块解析为字典(dict)或列表(list),假设JSON串同JavaScript示例:
(1)解析JSON为字典/列表
import json
json_string = '''
{
"name": "李四",
"hobbies": ["篮球", "编程"],
"family": {
"father": "李明",
"mother": "王芳"
}
}
'''
json_obj = json.loads(json_string) # 解析为字典
(2)遍历字典:items() 或 for...in
字典的 items() 方法可同时获取键和值:
for key, value in json_obj.items():
print(f"键: {key}, 值: {value}")
# 输出:
# 键: name, 值: 李四
# 键: hobbies, 值: ['篮球', '编程']
# 键: family, 值: {'father': '李明', 'mother': '王芳'}
(3)遍历列表:for 循环
若JSON顶层是列表(如商品列表):
json_list = [
{"id": 1, "product": "手机", "price": 2999},
{"id": 2, "product": "电脑", "price": 5999}
]
for item in json_list:
for key, value in item.items():
print(f" - {key}: {value}")
(4)递归遍历嵌套结构
def deep_traverse(data):
if isinstance(data, dict):
for key, value in data.items():
print(f"字典键: {key}", end=" -> ")
deep_traverse(value)
elif isinstance(data, list):
for index, item in enumerate(data):
print(f"列表元素{index}:", end=" ")
deep_traverse(item)
else:
print(f"基本值: {data}")
deep_traverse(json_obj)
(5)使用 jsonpath 处理复杂查询
若JSON结构复杂,可用 jsonpath 库(类似XPath)按路径提取数据,避免手动遍历:
from jsonpath import jsonpath # 提取所有hobbies hobbies = jsonpath(json_obj, '$..hobbies') # ..表示递归查找 print(hobbies) # [['篮球', '编程']] # 提取family中的father father = jsonpath(json_obj, '$.family.father') print(father) # ['李明']
Java:使用Gson或Jackson遍历
Java中需借助第三方库(如Gson、Jackson)解析JSON,假设JSON串同前:
(1)添加依赖(Maven)
<!-- Gson -->
<dependency>
<


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