本文目录导读:

在脚本(尤其是 Shell、Python、Node.js 等)中解析 JSON,有许多便捷方法,可以避免手动写复杂的字符串处理,以下是各场景下的最佳实践:
Python(最推荐)
标准库(无需安装)
import json
# 解析字符串
data = json.loads('{"name": "张三", "age": 30}')
# 解析文件
with open('data.json') as f:
data = json.load(f)
# 访问数据
print(data['name']) # 张三
使用 jq 风格的工具(更便捷)
pip install jello # 或 pyjq
# 使用 jello(类似 jq 的 Python 实现)
from jello import jello
data = jello('{"a": {"b": 1}}')
print(data.a.b) # 1
Shell 脚本(最常用)
jq(JSON 解析的瑞士军刀)
# 安装:apt install jq / brew install jq
# 解析并提取字段
echo '{"name":"张三","age":30}' | jq '.name' # "张三"
# 从文件读取
cat data.json | jq '.users[0].id'
# 格式化输出
curl -s api.example.com | jq .
# 高级用法:条件过滤
jq '.data[] | select(.type == "user") | .name' data.json
拼凑式方法(不推荐,仅无 jq 时可用)
# 使用 grep/sed 手动解析(很脆弱)
echo '{"key":"value"}' | grep -o '"key":"[^"]*"' | cut -d'"' -f4
Node.js
内置方法
// 解析字符串
const data = JSON.parse('{"name":"张三"}');
// 读取文件
const fs = require('fs');
const config = JSON.parse(fs.readFileSync('config.json', 'utf8'));
// 链式操作
const result = JSON.parse(response).data.items.map(item => item.name);
使用 Lodash(带路径访问)
const _ = require('lodash');
const data = { user: { name: "张三" } };
console.log(_.get(data, 'user.name')); // 张三
console.log(_.get(data, 'user.email', '默认值')); // 默认值
跨语言通用方案
jq(任何语言都能调用)
# 通过子进程调用灵活解析
os.system("echo '{\"key\": \"value\"}' | jq '.key'")
subprocess.run(["jq", ".key", "file.json"])
实用技巧对比
| 场景 | 方法 | 优点 | 缺点 |
|---|---|---|---|
| 快速提取 | jq |
一行搞定,强大 | 需安装 |
| 脚本开发 | Python json |
稳定,无需安装 | 语法略繁琐 |
| 批量处理 | jq + 管道 |
命令组合高效 | 学习曲线 |
| 错误处理 | Python json.loads |
异常捕获方便 | 代码稍多 |
| 嵌套访问 | jq '.a.b.c' |
简洁 | 复杂条件需要学习 |
| 测试/调试 | jq . |
格式化输出 |
终极推荐
- 日常 Shell 操作:装
jq,只用一行命令 - 脚本/自动化:Python
json模块,稳定性最好 - 复杂数据处理:Python +
pandas(可读 JSON 为 DataFrame)
示例:从 API 提取数据的最佳写法
# Shell 脚本一行搞定
curl -s https://api.example.com/users | jq '[.[] | {name, email}]'
# Python 脚本
import json, requests
response = requests.get("https://api.example.com/users").json()
for user in response:
print(user["name"], user.get("email", "无邮箱"))
建议优先掌握 jq(Shell)和 Python 的 json 模块,这两个组合能覆盖 95% 的 JSON 解析需求。