news 2026/8/30 6:16:01

Python中的JSON处理(标准库)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python中的JSON处理(标准库)

一、什么是JSON?

JSON(JavaScript Object Notation)是一种基于文本的开放标准,用于表示结构化数据。它采用键值对的形式组织数据,支持以下基本数据类型:

  • 字符串(string)
  • 数字(number)
  • 布尔值(true / false)
  • 空值(null)
  • 对象(object,即键值对集合)
  • 数组(array,即有序列表)

例如,一个简单的 JSON 数据如下:

{ "name": "张三", "age": 25, "is_student": true, "hobbies": ["读书", "游泳"], "address": null }

二、Python中的json模块

Python 的标准库json提供了将 Python 对象序列化为 JSON 字符串,以及将 JSON 字符串反序列化为 Python 对象的功能。该模块无需安装,直接导入即可使用:

import json

主要函数

函数功能
json.dumps(obj)将 Python 对象转换为 JSON 字符串
json.loads(s)将 JSON 字符串解析为 Python 对象
json.dump(obj, file)将 Python 对象写入文件(以 JSON 格式)
json.load(file)从文件读取 JSON 数据并解析为 Python 对象

三、数据类型映射关系

Python 与 JSON 在数据类型上存在一定的映射关系:

Python 类型JSON 类型
dictobject
list,tuplearray
strstring
int,floatnumber
Truetrue
Falsefalse
Nonenull

注意:Python 中的tuple会被转换为 JSON 的array,但反向解析时会变成list


四、基本用法示例

1. 序列化:Python对象 → JSON字符串(dumps)

import json data = { "name": "李四", "age": 30, "is_employee": True, "skills": ["Python", "Django", "Flask"], "address": None } # 转换为JSON字符串 json_str = json.dumps(data, ensure_ascii=False, indent=2) print(json_str)

输出结果:

{ "name": "李四", "age": 30, "is_employee": true, "skills": [ "Python", "Django", "Flask" ], "address": null }

参数说明:

  • ensure_ascii=False:允许非ASCII字符(如中文)正常显示,否则会转义。
  • indent=2:美化输出,使用2个空格缩进,便于阅读。

2. 反序列化:JSON字符串 → Python对象(loads)

json_string = ''' { "title": "Python入门教程", "pages": 256, "available": true, "tags": ["编程", "学习"] } ''' data = json.loads(json_string) print(type(data)) # <class 'dict'> print(data['title']) # Python入门教程

3. 写入JSON文件(dump)

with open('data.json', 'w', encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False, indent=4)

这会将data对象写入名为data.json的文件中,并以 UTF-8 编码保存,支持中文。


4. 读取JSON文件(load)

with open('data.json', 'r', encoding='utf-8') as f: loaded_data = json.load(f) print(loaded_data)

五、常见问题与注意事项

1. 处理中文乱码

默认情况下,json.dumps()会将非 ASCII 字符转义(如\u4e2d\u6587),需设置ensure_ascii=False才能正确显示中文。

2. 自定义对象无法直接序列化

Python 中自定义类的对象不能直接被json序列化。例如:

class Person: def __init__(self, name, age): self.name = name self.age = age p = Person("王五", 28) # json.dumps(p) # 报错:Object of type Person is not JSON serializable

解决方法:提供自定义的序列化函数或继承JSONEncoder

方法一:使用default参数
def person_serializer(obj): if isinstance(obj, Person): return {'name': obj.name, 'age': obj.age} raise TypeError(f"Object of type {type(obj)} is not JSON serializable") json_str = json.dumps(p, default=person_serializer, ensure_ascii=False, indent=2) print(json_str)
方法二:自定义 JSONEncoder
class PersonEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, Person): return {'name': obj.name, 'age': obj.age} return super().default(obj) json_str = json.dumps(p, cls=PersonEncoder, ensure_ascii=False, indent=2) print(json_str)

六、实际应用场景

  1. API 接口通信
    Web 开发中,客户端与服务器常通过 JSON 传输数据。Python 后端可使用json模块解析请求体或构造响应内容。

  2. 配置文件存储
    使用.json文件保存程序配置,如数据库连接信息、用户偏好设置等。

  3. 日志记录与数据导出
    将结构化数据以 JSON 格式保存,便于后续分析或迁移。

  4. 跨语言数据交换
    JSON 是语言无关的格式,Python 生成的 JSON 可被 JavaScript、Java、Go 等语言解析。


七、性能建议

  • 对于大量数据操作,避免频繁调用dumps/loads,可考虑批量处理。
  • 若需更高性能,可使用第三方库如ujsonorjson(非标准库,但兼容性好)。

总结

Python 的json模块是一个功能强大且简单易用的标准库,能够高效地完成 JSON 数据的序列化与反序列化。掌握其基本用法对于从事 Web 开发、数据处理或自动化脚本编写的开发者来说至关重要。

通过本文的学习,你应该已经掌握了:

  • 如何使用dumpsloads进行字符串级别的转换;
  • 如何使用dumpload操作 JSON 文件;
  • 如何处理中文、美化输出;
  • 如何扩展支持自定义对象;
  • 了解常见的使用场景与最佳实践。

📌参考文档
Python 官方文档 - json 模块

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/25 5:43:04

union 和 union all的区别

1、union和union all UNION对两个结果集进行并集操作&#xff0c;不包括重复行&#xff0c;相当于使用distinct关键字。而UNION ALL则对两个结果集进行并集操作&#xff0c;包括重复行&#xff0c;即所有结果全部显示&#xff0c;不管是否重复。 UNION操作会去除重复的记录&…

作者头像 李华
网站建设 2026/8/26 4:08:24

爱心公益 PPT 一键生成平台 TOP6,无需设计基础也能做

6款好用工具推荐&#xff0c;新手也能搞定爱心公益PPT一键生成 作为经常帮公益组织和校园社团做PPT的过来人&#xff0c;我太懂新手做爱心公益PPT的痛点了&#xff1a;找模板耗半天、排版没思路、素材怕侵权&#xff0c;最后熬夜做出来的效果还不尽如人意。其实现在有很多实用工…

作者头像 李华
网站建设 2026/8/26 9:43:40

中小企业必看!RFID资产管理系统,不用大投入也能高效管资产

跟不少中小企业老板和运维聊过&#xff0c;发现大家对资产管理都有个矛盾心理&#xff1a;想做好管理&#xff0c;又怕投入太多成本&#xff0c;最后得不偿失&#xff1b;放任不管&#xff0c;又总被资产混乱、盘点耗时、流失浪费等问题拖后腿。尤其是对于人员精简、预算有限的…

作者头像 李华
网站建设 2026/8/20 10:31:27

互联网大厂Java面试场景:从Spring到微服务的技术探讨

互联网大厂Java面试场景&#xff1a;从Spring到微服务的技术探讨 场景&#xff1a;互联网大厂面试现场 面试官是一位经验丰富的技术专家&#xff0c;而求职者“超好吃”则是一位刚刚准备进入互联网大厂的Java小白程序员。面试官开始了严肃而循序渐进的面试。 第一轮提问&…

作者头像 李华
网站建设 2026/8/29 13:28:06

智能体持久性记忆实战:从0到1构建双路记忆堆栈

本文介绍如何为智能体构建持久性记忆系统&#xff0c;通过双路记忆堆栈&#xff08;情节记忆语义记忆&#xff09;解决智能体健忘问题。情节记忆使用向量数据库存储对话历史&#xff0c;语义记忆使用图数据库存储结构化事实。文章详细展示了实现方法、代码构建及实际应用&#…

作者头像 李华
网站建设 2026/8/29 13:17:57

大模型学习全攻略:从零基础到AI专家的系统路线,【2026首发】AI大模型学习路线:适合新手和大学生

本文提供了从入门到高级的大模型学习完整路线&#xff0c;涵盖Python编程、数学基础、机器学习、深度学习等基础知识&#xff0c;以及自然语言处理、计算机视觉等进阶内容&#xff0c;并提供实战案例和学习资源&#xff0c;帮助小白和程序员系统掌握大模型技术&#xff0c;实现…

作者头像 李华