Python用标准库 json 在字典(以及列表等结构)与 JSON 文本之间转换。接口调用、配置文件、前后端传数据时经常用到。dumps / loads 面向字符串,dump / load 面向文件对象。

字典变成 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 时中文会按原文写出,而不是 \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 的是字符串版,不带 s 的直接读写文件。写文件时同样建议指定 UTF-8,并按需关闭 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