Base Tools-Associate-Third:json库详解

AI3小时前发布 beixibaobao
1 0 0

关联标准1:JSON(JavaScript Object Notation)
关联标准2:ECMAScript 2024(ECMAScript 2024 Language Specification)语言规范

一、json 库核心概念

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,Python 的 json 库是处理 JSON 数据的标准库,无需额外安装,直接导入即可使用,专门用于将 Python 数据结构与 JSON 字符串相互转换(序列化 / 反序列化)

方向 术语 作用 json 库方法
Python → JSON 序列化(encode) 将 Python 对象转为 JSON 字符串 json.dumps() / json.dump()
JSON → Python 反序列化(decode) 将 JSON 字符串转为 Python 对象 json.loads() / json.load()

二、核心方法详解

序列化:Python 对象转 JSON

1.json.dumps()转为 JSON 字符串

最常用的方法,接收 Python 对象,返回对应的 JSON 字符串

import json
# 1. 基础使用:Python 字典转 JSON 字符串
python_dict = {"name": "张三", "age": 20, "is_student": True, "hobbies": ["篮球", "编程"]}
json_str = json.dumps(python_dict)
print(type(json_str))  # <class 'str'>
print(json_str)        # {"name": "u5f20u4e09", "age": 20, "is_student": true, "hobbies": ["u7beeu7403", "u7f16u7a0b"]}
# 2. 优化输出:解决中文乱码、格式化排版
json_str_pretty = json.dumps(
    python_dict,
    ensure_ascii=False,  # 保留中文,不转为 Unicode 编码
    indent=4,            # 缩进4个空格,美化格式
    sort_keys=True       # 按键名排序
)
print(json_str_pretty)
"""
输出:
{
    "age": 20,
    "hobbies": [
        "篮球",
        "编程"
    ],
    "is_student": true,
    "name": "张三"
}
"""

2.json.dump()直接写入文件

将 Python 对象序列化后写入文件(无需手动打开文件再写),适合将 JSON 数据保存到本地

import json
python_data = {"name": "李四", "score": 95.5}
# 将数据写入 json 文件
with open("data.json", "w", encoding="utf-8") as f:
    json.dump(python_data, f, ensure_ascii=False, indent=2)
# 执行后会生成 data.json 文件,内容为格式化后的 JSON

反序列化:JSON 转 Python 对象

1.json.loads()解析 JSON 字符串

接收 JSON 格式的字符串,返回对应的 Python 数据结构(字典、列表等)

import json
# JSON 字符串(注意:JSON 中键必须是双引号,布尔值是 true/false,null 对应 Python 的 None)
json_str = '{"name": "王五", "age": 18, "is_student": false, "address": null}'
python_obj = json.loads(json_str)
print(type(python_obj))  # <class 'dict'>
print(python_obj)        # {'name': '王五', 'age': 18, 'is_student': False, 'address': None}
print(python_obj["name"])# 王五

2.json.load()从文件读取 JSON

直接读取 JSON 文件并转为 Python 对象,适合读取本地 JSON 文件

import json
# 读取之前生成的 data.json 文件
with open("data.json", "r", encoding="utf-8") as f:
    python_data = json.load(f)
print(type(python_data))  # <class 'dict'>
print(python_data["score"])  # 95.5

三、数据类型映射(重点)

JSON 和 Python 的数据类型并非完全一致,转换时会自动映射,这是容易出错的点:

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

⚠️ 注意:

  • JSON 不支持 Python 的 tuple(元组),序列化时会被转为列表
  • JSON 不支持 Python 的 set(集合),直接序列化会报错,需手动处理
  • JSON 键必须是字符串(双引号),Python 字典的键可以是任意可哈希类型(如数字),反序列化后会转为字符串

四、进阶用法:自定义序列化 / 反序列化

如果需要处理特殊对象(如自定义类、日期对象)默认的 json 方法无法直接转换,需自定义编码器 / 解码器

示例:处理 datetime 日期对象

import json
from datetime import datetime
# 自定义编码器:处理 datetime 对象
class DateTimeEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime):
            return obj.strftime("%Y-%m-%d %H:%M:%S")  # 转为字符串
        return super().default(obj)  # 其他类型按默认处理
# 序列化:包含日期对象的 Python 字典
python_data = {
    "name": "赵六",
    "create_time": datetime.now()
}
json_str = json.dumps(python_data, cls=DateTimeEncoder, ensure_ascii=False, indent=2)
print(json_str)
"""
输出:
{
  "name": "赵六",
  "create_time": "2025-12-19 10:00:00"  # 日期转为指定格式的字符串
}
"""
# 自定义解码器:将字符串转回 datetime 对象
def datetime_decoder(obj):
    if "create_time" in obj:
        obj["create_time"] = datetime.strptime(obj["create_time"], "%Y-%m-%d %H:%M:%S")
    return obj
# 反序列化
python_obj = json.loads(json_str, object_hook=datetime_decoder)
print(type(python_obj["create_time"]))  # <class 'datetime.datetime'>

五、常见错误及解决

  1. JSON 格式错误:如键用单引号、布尔值首字母大写(True)、逗号多余等,反序列化时会报 JSONDecodeError,需检查 JSON 字符串格式
  2. 中文乱码序列化时未加 ensure_ascii=False,导致中文转为 Unicode 编码,添加该参数即可解决
  3. 不支持的类型:如序列化 set 或自定义类,需自定义编码器(如上例)

总结

  1. json 库是 Python 处理 JSON 数据的标准库,核心是序列化(dumps/dump)反序列化(loads/load) 两类方法
  2. 注意 JSON 与 Python 数据类型的映射关系(如 JSON 的 true 对应 Python 的 Truenull 对应 None
  3. 处理中文或格式化输出时需添加 ensure_ascii=Falseindent 参数处理特殊对象需自定义编码器 / 解码器
© 版权声明

相关文章