JSON与YAML处理-配置文件全解析

一、JSON快速入门

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于API数据传输和配置文件。

1.1 JSON特点

1
2
3
4
5
6
7
8
9
10
11
┌─────────────────────────────────────────────────────────────────┐
JSON特点 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 📝 简洁 → 易于人阅读和编写 │
│ 🔄 通用 → 几乎所有编程语言都支持 │
│ ⚡ 高效 → 解析速度快,体积小 │
│ 🌐 Web → API数据传输标准格式 │
│ 📦 配置 → 应用程序配置文件 │
│ │
└─────────────────────────────────────────────────────────────────┘

1.2 JSON基本语法

1
2
3
4
5
6
7
8
9
10
11
12
{
"name": "张三",
"age": 25,
"isStudent": false,
"scores": [90, 85, 92],
"address": {
"city": "北京",
"district": "朝阳区"
},
"skills": ["Python", "JavaScript", "Go"],
"phone": null
}

1.3 数据类型

类型 示例 说明
字符串 "Hello" 必须用双引号
数字 25, 3.14 整数或浮点数
布尔 true, false 小写
空值 null 表示空
数组 ["a", "b"] 有序列表
对象 {"key": "value"} 键值对

二、JSON操作

2.1 Python操作JSON

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import json

# 字符串转字典(解析)
json_str = '{"name": "张三", "age": 25}'
data = json.loads(json_str)
print(data['name']) # 张三

# 文件读取
with open('data.json', 'r', encoding='utf-8') as f:
data = json.load(f)

# 字典转字符串
data = {'name': '张三', 'age': 25}
json_str = json.dumps(data)
print(json_str) # {"name": "张三", "age": 25}

# 格式化输出
json_str = json.dumps(data, indent=2, ensure_ascii=False)
print(json_str)
# {
# "name": "张三",
# "age": 25
# }

# 写入文件
with open('data.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)

2.2 JavaScript操作JSON

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 字符串转对象
const jsonStr = '{"name": "张三", "age": 25}';
const obj = JSON.parse(jsonStr);
console.log(obj.name); // 张三

// 对象转字符串
const obj = {name: '张三', age: 25};
const jsonStr = JSON.stringify(obj);
console.log(jsonStr); // {"name":"张三","age":25}

// 格式化输出
const jsonStr = JSON.stringify(obj, null, 2);
console.log(jsonStr);
// {
// "name": "张三",
// "age": 25
// }

// 深拷贝
const copy = JSON.parse(JSON.stringify(obj));

2.3 jq命令行工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 安装
# Ubuntu
sudo apt install jq

# macOS
brew install jq

# 基本使用
echo '{"name": "张三", "age": 25}' | jq '.name' # "张三"

# 读取文件
jq '.name' data.json

# 读取嵌套属性
jq '.address.city' data.json

# 数组操作
echo '{"items": [1, 2, 3]}' | jq '.items[]' # 1 2 3

# 过滤
cat data.json | jq '.users[] | select(.age > 20)'

# 映射
cat data.json | jq '.users[] | {name: .name, age: .age}'

# 修改
echo '{"name": "张三"}' | jq '.name = "李四"'

# 删除
echo '{"a": 1, "b": 2}' | jq 'del(.b)'

# 统计
echo '[1,2,3,4,5]' | jq 'add' # 15
echo '[1,2,3,4,5]' | jq 'length' # 5

三、YAML快速入门

YAML(YAML Ain’t Markup Language)是一种人类可读的数据序列化格式,常用于配置文件。

3.1 YAML特点

1
2
3
4
5
6
7
8
9
10
11
┌─────────────────────────────────────────────────────────────────┐
│ YAML特点 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 📖 可读 → 类似自然语言,易于阅读 │
│ 🔨 简洁 → 不需要引号、逗号等符号 │
│ 📊 结构 → 支持复杂嵌套和关系 │
│ 🔄 兼容 → 支持JSON语法 │
│ ⚙️ 配置 → Docker、K8s、Ansible等标配 │
│ │
└─────────────────────────────────────────────────────────────────┘

3.2 YAML基本语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# 字符串
name: 张三
message: "你好,世界" # 需要引号
message2: '包含"引号"' # 单引号

# 数字
age: 25
price: 19.99
count: 1000

# 布尔
isActive: true
isDeleted: false

# 空值
phone: null
phone2: ~

# 多行字符串
description: |
第一行
第二行
第三行

# 折叠多行
content: >
这是一段
折叠的
文本

# 数组
skills:
- Python
- JavaScript
- Go

# 对象
user:
name: 张三
age: 25

# 行内表示
person: {name: 张三, age: 25}
colors: [red, green, blue]

四、YAML操作

4.1 Python操作YAML

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import yaml

# 安装
# pip install pyyaml

# 字符串转字典
yaml_str = '''
name: 张三
age: 25
skills:
- Python
- JavaScript
'''
data = yaml.safe_load(yaml_str)
print(data['name']) # 张三
print(data['skills']) # ['Python', 'JavaScript']

# 文件读取
with open('config.yaml', 'r', encoding='utf-8') as f:
data = yaml.safe_load(f)

# 字典转字符串
data = {
'name': '张三',
'age': 25,
'skills': ['Python', 'JavaScript']
}
yaml_str = yaml.dump(data, allow_unicode=True, indent=2)
print(yaml_str)

# 写入文件
with open('config.yaml', 'w', encoding='utf-8') as f:
yaml.dump(data, f, allow_unicode=True, indent=2)

# 加载所有文档(多文档)
yaml_str = '''
---
name: 张三
---
name: 李四
'''
docs = list(yaml.safe_load_all(yaml_str))

4.2 JavaScript操作YAML

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 安装
// npm install js-yaml

const yaml = require('js-yaml');
const fs = require('fs');

// 字符串转对象
const yamlStr = `
name: 张三
age: 25
`;
const obj = yaml.load(yamlStr);
console.log(obj.name); // 张三

// 文件读取
const obj = yaml.load(fs.readFileSync('config.yaml', 'utf8'));

// 对象转字符串
const yamlStr = yaml.dump(obj);
console.log(yamlStr);

4.3 yq命令行工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 安装
# Ubuntu
sudo apt install yq

# macOS
brew install yq

# 基本使用
yq '.name' config.yaml

# 读取嵌套属性
yq '.user.name' config.yaml

# 读取数组元素
yq '.skills[0]' config.yaml

# 过滤
yq '.users[] | select(.age > 20)' config.yaml

# 修改
yq -i '.name = "李四"' config.yaml

# 删除
yq -i 'del(.age)' config.yaml

# 合并文件
yq eval-all 'select(fileIndex == 0) * select(fileIndex == 1)' a.yaml b.yaml

五、JSON vs YAML对比

5.1 语法对比

1
2
3
4
5
6
// JSON
{
"name": "张三",
"age": 25,
"skills": ["Python", "Java"]
}
1
2
3
4
5
6
# YAML
name: 张三
age: 25
skills:
- Python
- Java

5.2 对比表

特性 JSON YAML
可读性 一般 更好
注释 不支持 支持
多行 不支持 支持
类型 有限 丰富
解析速度 稍慢
使用场景 API传输 配置文件

六、实战案例

6.1 API数据处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import requests
import json

# 模拟API请求
response = requests.get('https://api.example.com/data')
data = response.json()

# 提取需要的数据
users = data['users']
adults = [u for u in users if u['age'] >= 18]

# 转换为YAML
import yaml
yaml_str = yaml.dump({'adults': adults}, allow_unicode=True, indent=2)

# 保存
with open('output.yaml', 'w') as f:
f.write(yaml_str)

6.2 配置文件处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import json
import yaml

# 加载配置(支持JSON和YAML)
def load_config(path):
with open(path, 'r') as f:
if path.endswith('.json'):
return json.load(f)
elif path.endswith(('.yaml', '.yml')):
return yaml.safe_load(f)

# 保存配置
def save_config(data, path):
with open(path, 'w') as f:
if path.endswith('.json'):
json.dump(data, f, ensure_ascii=False, indent=2)
elif path.endswith(('.yaml', '.yml')):
yaml.dump(data, f, allow_unicode=True, indent=2)

# 使用
config = load_config('app.yaml')
config['debug'] = True
save_config(config, 'app.yaml')

6.3 数据转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import json
import yaml

# JSON转YAML
def json_to_yaml(json_file, yaml_file):
with open(json_file, 'r') as f:
data = json.load(f)
with open(yaml_file, 'w') as f:
yaml.dump(data, f, allow_unicode=True, indent=2)

# YAML转JSON
def yaml_to_json(yaml_file, json_file):
with open(yaml_file, 'r') as f:
data = yaml.safe_load(f)
with open(json_file, 'w') as f:
json.dump(data, f, ensure_ascii=False, indent=2)

# 使用
json_to_yaml('data.json', 'data.yaml')
yaml_to_json('config.yaml', 'config.json')

6.4 验证配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import json
import yaml
from jsonschema import validate

# 定义Schema
schema = {
"type": "object",
"properties": {
"name": {"type": "string"},
"age": {"type": "integer", "minimum": 0},
"email": {"type": "string", "format": "email"}
},
"required": ["name", "email"]
}

# 验证JSON
data = {"name": "张三", "email": "test@example.com"}
try:
validate(instance=data, schema=schema)
print("验证通过")
except Exception as e:
print(f"验证失败: {e}")

# 验证YAML
with open('config.yaml', 'r') as f:
data = yaml.safe_load(f)
try:
validate(instance=data, schema=schema)
print("验证通过")
except Exception as e:
print(f"验证失败: {e}")

七、在线工具

工具 用途
JSONFormatter JSON格式化
YAML Validator YAML验证
JSON to YAML JSON转YAML
YAML to JSON YAML转JSON

八、常见问题

8.1 JSON中文乱码

1
2
# 解决中文显示问题
json.dumps(data, ensure_ascii=False, indent=2)

8.2 YAML多文档

1
2
3
4
5
6
7
8
9
10
11
12
# 多个文档用 --- 分隔
---
name: 张三
age: 25
---
name: 李四
age: 30

# 读取所有文档
import yaml
with open('file.yaml', 'r') as f:
docs = list(yaml.safe_load_all(f))

8.3 特殊字符

1
2
3
4
# YAML中特殊字符需要引号
special: "包含:冒号"
special2: "包含#井号"
special3: "包含\n换行"

九、VSCode插件推荐

插件 功能
JSON Tools JSON格式化、压缩
YAML YAML语法高亮、验证
Prettier 代码格式化
JSON Crack JSON可视化

参考资料


持续更新中…欢迎收藏!

#JSON #YAML #配置文件 #教程


JSON与YAML处理-配置文件全解析
https://r0f2.my/post/20-json-yaml-processing/
作者
JA
发布于
2026年2月14日
许可协议