Base Tools-Associate-Third:json库详解

张开发
2026/4/28 12:53:55 15 分钟阅读

分享文章

Base Tools-Associate-Third:json库详解
关联标准1JSONJavaScript Object Notation关联标准2ECMAScript 2024ECMAScript 2024 Language Specification语言规范一、json 库核心概念JSONJavaScript 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 对象转 JSON1.json.dumps()转为 JSON 字符串最常用的方法接收 Python 对象返回对应的 JSON 字符串importjson# 1. 基础使用Python 字典转 JSON 字符串python_dict{name:张三,age:20,is_student:True,hobbies:[篮球,编程]}json_strjson.dumps(python_dict)print(type(json_str))# class strprint(json_str)# {name: \u5f20\u4e09, age: 20, is_student: true, hobbies: [\u7bee\u7403, \u7f16\u7a0b]}# 2. 优化输出解决中文乱码、格式化排版json_str_prettyjson.dumps(python_dict,ensure_asciiFalse,# 保留中文不转为 Unicode 编码indent4,# 缩进4个空格美化格式sort_keysTrue# 按键名排序)print(json_str_pretty) 输出 { age: 20, hobbies: [ 篮球, 编程 ], is_student: true, name: 张三 } 2.json.dump()直接写入文件将 Python 对象序列化后写入文件无需手动打开文件再写适合将 JSON 数据保存到本地importjson python_data{name:李四,score:95.5}# 将数据写入 json 文件withopen(data.json,w,encodingutf-8)asf:json.dump(python_data,f,ensure_asciiFalse,indent2)# 执行后会生成 data.json 文件内容为格式化后的 JSON反序列化JSON 转 Python 对象1.json.loads()解析 JSON 字符串接收 JSON 格式的字符串返回对应的 Python 数据结构字典、列表等importjson# JSON 字符串注意JSON 中键必须是双引号布尔值是 true/falsenull 对应 Python 的 Nonejson_str{name: 王五, age: 18, is_student: false, address: null}python_objjson.loads(json_str)print(type(python_obj))# class dictprint(python_obj)# {name: 王五, age: 18, is_student: False, address: None}print(python_obj[name])# 王五2.json.load()从文件读取 JSON直接读取 JSON 文件并转为 Python 对象适合读取本地 JSON 文件importjson# 读取之前生成的 data.json 文件withopen(data.json,r,encodingutf-8)asf:python_datajson.load(f)print(type(python_data))# class dictprint(python_data[score])# 95.5三、数据类型映射重点JSON 和 Python 的数据类型并非完全一致转换时会自动映射这是容易出错的点JSON 类型Python 类型objectdictarrayliststringstrnumber (int/float)int/floattrueTruefalseFalsenullNone⚠️ 注意JSON 不支持 Python 的tuple元组序列化时会被转为列表JSON 不支持 Python 的set集合直接序列化会报错需手动处理JSON 键必须是字符串双引号Python 字典的键可以是任意可哈希类型如数字反序列化后会转为字符串四、进阶用法自定义序列化 / 反序列化如果需要处理特殊对象如自定义类、日期对象默认的json方法无法直接转换需自定义编码器 / 解码器示例处理 datetime 日期对象importjsonfromdatetimeimportdatetime# 自定义编码器处理 datetime 对象classDateTimeEncoder(json.JSONEncoder):defdefault(self,obj):ifisinstance(obj,datetime):returnobj.strftime(%Y-%m-%d %H:%M:%S)# 转为字符串returnsuper().default(obj)# 其他类型按默认处理# 序列化包含日期对象的 Python 字典python_data{name:赵六,create_time:datetime.now()}json_strjson.dumps(python_data,clsDateTimeEncoder,ensure_asciiFalse,indent2)print(json_str) 输出 { name: 赵六, create_time: 2025-12-19 10:00:00 # 日期转为指定格式的字符串 } # 自定义解码器将字符串转回 datetime 对象defdatetime_decoder(obj):ifcreate_timeinobj:obj[create_time]datetime.strptime(obj[create_time],%Y-%m-%d %H:%M:%S)returnobj# 反序列化python_objjson.loads(json_str,object_hookdatetime_decoder)print(type(python_obj[create_time]))# class datetime.datetime五、常见错误及解决JSON 格式错误如键用单引号、布尔值首字母大写True、逗号多余等反序列化时会报JSONDecodeError需检查 JSON 字符串格式中文乱码序列化时未加ensure_asciiFalse导致中文转为 Unicode 编码添加该参数即可解决不支持的类型如序列化set或自定义类需自定义编码器如上例总结json库是 Python 处理 JSON 数据的标准库核心是序列化dumps/dump和反序列化loads/load两类方法注意 JSON 与 Python 数据类型的映射关系如 JSON 的true对应 Python 的Truenull对应None处理中文或格式化输出时需添加ensure_asciiFalse和indent参数处理特殊对象需自定义编码器 / 解码器

更多文章