Skip to main content
Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

JSON

官方文档: https://docs.python.org/zh-cn/3.12/library/json.html

Python 提供 json 模块来处理 JSON 数据:

import json

1. JSON 的四个核心函数

1.1 json.loads() —— JSON 字符串 -> Python 对象

data = json.loads('{"a": 1, "b": 2}')
print(data)  # {'a': 1, 'b': 2}

1.2 json.dumps() —— Python 对象 -> JSON 字符串

s = json.dumps({"a": 1, "b": 2})
print(s)  # '{"a": 1, "b": 2}'

1.3 json.load() —— 从文件读取 JSON -> Python

with open("config.json") as f:
    data = json.load(f)

1.4 json.dump() —— Python -> 写入 JSON 文件

with open("config.json", "w") as f:
    json.dump({"x": 10}, f)

2. Python 与 JSON 的类型映射表

JSON Python
object dict
array list
string str
number int / float
true / false True / False
null None

3. 常见参数配置(超重要)

3.1 indent(格式化输出)

让 JSON 更漂亮:

print(json.dumps(data, indent=4))

3.2 ensure_ascii=False(输出中文)

默认:中文会变成 Unicode:

json.dumps({"name": "张三"})
# {"name": "\u5f20\u4e09"}

正确:

json.dumps({"name": "张三"}, ensure_ascii=False)
# {"name": "张三"}

3.3 sort_keys=True(按 key 排序)

json.dumps(data, sort_keys=True)

3.4 default=func(用于无法序列化的对象)

例如:datetime / Decimal

import json
from datetime import datetime

result = json.dumps(
    {"time": datetime.now()},
    default=str,            # 自动转字符串
    ensure_ascii=False
)

让所有“不能 JSON 化的对象”自动变字符串。

4. 处理非标准 JSON(常见错误场景)

JSON 不能处理:

  • 单引号 { 'x': 1 }
  • 结尾多逗号 { "x": 1, }
  • 注释 //
  • datetime
  • Decimal
  • bytes

解决:

  • 建议用 default=str 自动转格式
  • 或用第三方库 orjson 更智能

5. JSON 解析错误的典型例子

json.loads("{'a': 1}")  
# JSONDecodeError: Expecting property name enclosed in double quotes

必须改成:

json.loads('{"a": 1}')

6. 处理复杂对象(自定义序列化)

自定义类 -> JSON

class User:
    def __init__(self, name):
        self.name = name

def encode(obj):
    if isinstance(obj, User):
        return {"name": obj.name}
    raise TypeError("无法序列化")

u = User("martin")

print(json.dumps(u, default=encode, ensure_ascii=False))

7. 反序列化自定义对象

用 object_hook:

def as_user(d):
    if "name" in d:
        return User(d["name"])
    return d

user = json.loads('{"name": "martin"}', object_hook=as_user)

8. JSON 流式处理(大文件必备)

不要一次性加载超大 JSON 文件!

推荐:逐行读取 NDJSON(JSON Lines)

{"a":1}
{"a":2}

解析:

with open("log.jsonl") as f:
    for line in f:
        item = json.loads(line)
        process(item)

9. JSON 性能优化

9.1 使用 orjson(最快)

import orjson

orjson.dumps(data)
orjson.loads(s)

比内置 json 快 5–20 倍。

9.2 使用 ujson(中等速度)

10. json.dumps() 不支持的类型(常见坑)

类型 解决方案
datetime default=str 或自定义序列化
Decimal float(x) 或 default=str
bytes .decode()
set list(set)

例子:

json.dumps({"data": {1,2,3}}, default=list)

11. 两个常见易错点

11.1 JSON 不支持 tuple,会自动变 list

json.dumps((1,2,3))
# [1, 2, 3]

11.2 JSON 不支持 Python 注释

{
    // 不行
    "a": 1
}

12. 总结(最核心 10 条)

  1. JSON 字符串 -> Python: loads()
  2. Python -> JSON 字符串: dumps()
  3. 文件读取/写入用:load() / dump()
  4. 输出中文要:ensure_ascii=False
  5. 排序:sort_keys=True
  6. 美化:indent=4
  7. 无法序列化对象:用 default=str
  8. JSON 要用双引号,不允许注释
  9. 超大 JSON 用逐行解析(JSON Lines)
  10. 性能敏感场景推荐 orjson