在 Python 中,标准库 json 在字典、列表等结构与 JSON 文本之间转换,常用于接口数据、配置文件及前后端交换。dumps / loads 面向字符串,dump / load 面向文件对象。JSON 键须用双引号,与 Python 字面量语法并不相同。本节说明常用 API 及类型对应关系。

字典序列化为 JSON 字符串

import json

data = {"name": "Tom", "age": 20, "skills": ["py", "c"]}
json_str = json.dumps(data)
print(json_str)
print(type(json_str))

dumps 的常用参数

indent 可输出带缩进的字符串,便于阅读。ensure_ascii=False 时非 ASCII 字符(如中文)按原文写出,而非 \uXXXX 转义:

import json

data = {"name": "Tom", "age": 20}
print(json.dumps(data))
print(json.dumps(data, indent=2))
print(json.dumps({"n": "小明"}, ensure_ascii=False))

loads:字符串解析为对象

import json

s = '{"name": "Tom", "age": 20}'
data = json.loads(s)
print(data["name"])
print(type(data))

文本不符合 JSON 语法时将引发 json.JSONDecodeError,可用 try 捕获:

try:
    data = json.loads('{"a": }')
except json.JSONDecodeError as e:
    print("JSON 格式错误:", e)

读写 JSON 文件

带 s 的 API 处理字符串;不带 s 的直接读写文件。写文件时建议指定 UTF-8 编码,并按需设置 ensure_ascii:

import json

data = {"name": "Tom", "age": 20}
with open("data.json", "w", encoding="utf-8") as f:
    json.dump(data, f, ensure_ascii=False, indent=2)

with open("data.json", "r", encoding="utf-8") as f:
    loaded = json.load(f)
print(loaded["name"])

类型对应关系

JSONPython
{"k": "v"}dict
[1, 2]list
"text"str
123int
1.5float
true / falseTrue / False
nullNone

JSON 中的布尔与空值为小写 true、false、null,与 Python 的 True、False、None 不同,模块在转换时会自动映射。

嵌套结构

import json

s = '{"user": {"name": "Tom", "tags": ["a", "b"]}}'
data = json.loads(s)
print(data["user"]["name"])
print(data["user"]["tags"][0])

常见错误

  • JSON 字符串中的键须用双引号;Python 字典的单引号写法不能直接交给 loads。
  • 元组经 dumps 变为 JSON 数组,loads 后得到列表,不再是元组。
  • 须保留可读中文时,应设置 ensure_ascii=False。

本节说明了 Python 中 json 模块的常用接口。下一节介绍日期与时间:datetime 的格式化与解析。