JSON操作 #

一、基本操作 #

python
import json

# Python对象 -> JSON字符串
data = {"name": "Tom", "age": 25}
json_str = json.dumps(data)
print(json_str)  # '{"name": "Tom", "age": 25}'

# JSON字符串 -> Python对象
data = json.loads(json_str)
print(data)  # {'name': 'Tom', 'age': 25}

二、格式化输出 #

python
import json

data = {"name": "Tom", "age": 25, "skills": ["Python", "JavaScript"]}

# 缩进格式化
json_str = json.dumps(data, indent=2)
print(json_str)
# {
#   "name": "Tom",
#   "age": 25,
#   "skills": [
#     "Python",
#     "JavaScript"
#   ]
# }

# 排序键
json_str = json.dumps(data, indent=2, sort_keys=True)

三、文件操作 #

python
import json

# 写入JSON文件
data = {"name": "Tom", "age": 25}
with open('data.json', 'w') as f:
    json.dump(data, f, indent=2)

# 读取JSON文件
with open('data.json') as f:
    data = json.load(f)

四、自定义序列化 #

python
import json
from datetime import datetime

# 自定义编码器
class DateTimeEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime):
            return obj.isoformat()
        return super().default(obj)

data = {"time": datetime.now()}
json_str = json.dumps(data, cls=DateTimeEncoder)

# 使用default参数
def encode_datetime(obj):
    if isinstance(obj, datetime):
        return obj.isoformat()
    raise TypeError(f"Type {type(obj)} not serializable")

json_str = json.dumps(data, default=encode_datetime)

五、自定义反序列化 #

python
import json
from datetime import datetime

def decode_datetime(dct):
    if 'time' in dct:
        dct['time'] = datetime.fromisoformat(dct['time'])
    return dct

json_str = '{"time": "2024-03-16T10:30:00"}'
data = json.loads(json_str, object_hook=decode_datetime)

六、类型映射 #

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

七、异常处理 #

python
import json

try:
    data = json.loads('invalid json')
except json.JSONDecodeError as e:
    print(f"JSON解析错误:{e}")
最后更新:2026-03-16