Python 内置json标准库实现转换,字典是内存数据结构,JSON 是字符串格式,二者本质不同。
一、核心方法
| 功能 | 函数 | 说明 |
|---|---|---|
| 字典 → JSON 字符串 | json.dumps() | 序列化 |
| JSON 字符串 → 字典 | json.loads() | 反序列化 |
| 字典写入 JSON 文件 | json.dump() | 写入文件 |
| 读取 JSON 文件 → 字典 | json.load() | 读取文件 |
二、基础代码示例
1. 字典 转 JSON 字符串(dumps)
python
运行
import json # Python 字典 data = { "name": "张三", "age": 25, "hobby": ["游泳", "阅读"], "is_student": False } # 转为 JSON 字符串 json_str = json.dumps(data) print("JSON 字符串:", json_str) print("类型:", type(json_str)) # <class 'str'>常用参数美化输出
ensure_ascii=False:保留中文(必加,否则中文变 unicode 编码)indent=4:缩进格式化,方便阅读
python
运行
json_str = json.dumps(data, ensure_ascii=False, indent=4) print(json_str)2. JSON 字符串 转 字典(loads)
python
运行
# 已有 JSON 字符串 json_str = '{"name": "李四", "age": 22, "hobby": ["跑步"]}' # 解析为字典 dict_data = json.loads(json_str) print("字典:", dict_data) print("类型:", type(dict_data)) # <class 'dict'> # 按 key 取值 print(dict_data["name"])三、读写 JSON 文件(dump /load)
1. 字典写入.json文件
python
运行
data = {"title": "测试", "content": "JSON 文件操作"} # 写入文件 with open("test.json", "w", encoding="utf-8") as f: json.dump(data, f, ensure_ascii=False, indent=4)2. 读取.json文件转为字典
python
运行
# 读取文件 with open("test.json", "r", encoding="utf-8") as f: file_data = json.load(f) print(file_data, type(file_data))四、关键注意事项(避坑)
1. 数据类型差异
JSON 支持类型有限,转换会自动适配:
- Python
True/False→ JSONtrue/false - Python
None→ JSONnull - 元组 tuple会转为 JSON 数组
list
python
运行
import json d = {"data": (1, 2, 3)} # 元组 res = json.dumps(d) print(res) # 输出数组:{"data": [1, 2, 3]}2. 键名必须是字符串
JSON 要求键只能是字符串,Python 字典数字键会自动转字符串:
python
运行
d = {100: "数字键"} s = json.dumps(d) print(s) # {"100": "数字键"}3. 不支持的类型
Python 特有类型(datetime、自定义对象、集合set)无法直接转 JSON,会报错,需要手动转换。
4. 引号区别
- JSON 标准:只允许双引号
" - Python 字典:单 / 双引号都可以
错误写法:JSON 字符串用单引号,
loads()解析失败
五、结合 LangChain 实战场景
常用于大模型输出结构化解析:
python
运行
import json from langchain_core.output_parsers import JsonOutputParser from langchain_core.prompts import ChatPromptTemplate from langchain_openai import ChatOpenAI llm = ChatOpenAI(temperature=0) prompt = ChatPromptTemplate.from_template(""" 提取信息并返回纯JSON:姓名、年龄 内容:{info} """) chain = prompt | llm # 模型返回 JSON 格式字符串 resp = chain.invoke({"info": "王五,28岁"}) json_str = resp.content # 字符串转字典 result = json.loads(json_str) print(result["姓名"], result["年龄"])六、速记总结
- 内存互转:
dumps(字典→串) /loads(串→字典) - 文件互转:
dump(写文件) /load(读文件) - 中文必加:
ensure_ascii=False - 格式化查看:搭配
indent参数 - JSON 仅支持:对象、数组、字符串、数字、布尔、null