一、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)
json_str = json.dumps(data, indent=2, ensure_ascii=False) print(json_str)
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);
const jsonStr = JSON.stringify(obj, null, 2); console.log(jsonStr);
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
|
sudo apt install jq
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[]'
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' echo '[1,2,3,4,5]' | jq 'length'
|
三、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
yaml_str = ''' name: 张三 age: 25 skills: - Python - JavaScript ''' data = yaml.safe_load(yaml_str) print(data['name']) print(data['skills'])
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
|
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
|
sudo apt install yq
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
| { "name": "张三", "age": 25, "skills": ["Python", "Java"] }
|
1 2 3 4 5 6
| 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
response = requests.get('https://api.example.com/data') data = response.json()
users = data['users'] adults = [u for u in users if u['age'] >= 18]
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
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
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)
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 = { "type": "object", "properties": { "name": {"type": "string"}, "age": {"type": "integer", "minimum": 0}, "email": {"type": "string", "format": "email"} }, "required": ["name", "email"] }
data = {"name": "张三", "email": "test@example.com"} try: validate(instance=data, schema=schema) print("验证通过") except Exception as e: print(f"验证失败: {e}")
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}")
|
七、在线工具
八、常见问题
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
| special: "包含:冒号" special2: "包含#井号" special3: "包含\n换行"
|
九、VSCode插件推荐
| 插件 |
功能 |
| JSON Tools |
JSON格式化、压缩 |
| YAML |
YAML语法高亮、验证 |
| Prettier |
代码格式化 |
| JSON Crack |
JSON可视化 |
参考资料
持续更新中…欢迎收藏!
#JSON #YAML #配置文件 #教程