1. 导入模块​

import json

​2. Python与JSON数据类型对应​

JSON 类型

Python 类型

object

dict

array

list

string

str

number

int/float

true/false

True/False

null

None


​3. 序列化与反序列化​

  • 序列化​(Python → JSON):json.dumps()

  • 反序列化​(JSON → Python):json.loads()

示例:

# 序列化:Python对象 → JSON字符串
data = {"name": "张三", "age": 30, "hobbies": ["读书", "跑步"]}
json_str = json.dumps(data, ensure_ascii=False)  # 处理中文
print(json_str)  # {"name": "张三", "age": 30, "hobbies": ["读书", "跑步"]}

# 反序列化:JSON字符串 → Python对象
python_obj = json.loads(json_str)
print(python_obj["name"])  # 张三

​4. 文件读写JSON​

写入JSON文件:

data = {"name": "李四", "city": "北京"}
with open("data.json", "w", encoding="utf-8") as f:
    json.dump(data, f, ensure_ascii=False, indent=4)  # 格式美化

读取JSON文件:

with open("data.json", "r", encoding="utf-8") as f:
    loaded_data = json.load(f)
print(loaded_data["city"])  # 北京

​5. 处理复杂数据类型​

自定义对象序列化:

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

# 自定义序列化函数
def user_to_dict(user):
    return {"name": user.name, "age": user.age}

user = User("王五", 25)
json_str = json.dumps(user, default=user_to_dict, ensure_ascii=False)
print(json_str)  # {"name": "王五", "age": 25}

反序列化自定义对象:

def dict_to_user(d):
    return User(d["name"], d["age"])

data = json.loads(json_str, object_hook=dict_to_user)
print(data.name)  # 王五

​6. 格式化与参数​

  • indent: 缩进美化

  • sort_keys: 按键排序

  • ensure_ascii: 禁止ASCII转义(支持中文)

  • skipkeys: 跳过非字典键

示例:

复制

data = {"b": 2, "a": 1, "c": "你好"}
json_str = json.dumps(data, indent=2, sort_keys=True, ensure_ascii=False)
print(json_str)
# {
#   "a": 1,
#   "b": 2,
#   "c": "你好"
# }

​7. 处理日期时间​

JSON不支持datetime类型,需手动转换:

from datetime import datetime

def datetime_serializer(o):
    if isinstance(o, datetime):
        return o.isoformat()

data = {"time": datetime.now()}
json_str = json.dumps(data, default=datetime_serializer)
print(json_str)  # {"time": "2023-10-10T12:34:56.789012"}

反序列化时同理,需要使用object_hook还原日期对象。


​8. 错误处理​

处理无效JSON数据:

invalid_json = "{'name': 'test'}"  # 注意JSON要求双引号
try:
    data = json.loads(invalid_json)
except json.JSONDecodeError as e:
    print(f"解析错误:{e}")

​9. 高级应用​

  • 批量处理大文件​:使用ijson库流式解析。

  • 安全性​:避免解析不可信来源的JSON(防范注入攻击)。


通过上述方法,你可以在Python中灵活处理JSON数据,适用于API交互、配置文件读写等场景。