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 对象的功能。该模块无需安装,直接导入即可使用:

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 类型
dict object
list, tuple array
str string
int, float number
True true
False false
None null

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


四、基本用法示例

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

python 复制代码
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)

python 复制代码
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)

python 复制代码
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 序列化。例如:

python 复制代码
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 参数
python 复制代码
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
python 复制代码
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,可考虑批量处理。
  • 若需更高性能,可使用第三方库如 ujson 或 orjson(非标准库,但兼容性好)。

总结

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

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

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

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

相关推荐
不是万能的豆学长1 小时前
filetidy 文件整理助手:一键归类 + 规范重命名(Python 零依赖单文件工具)
大数据·开发语言·python·技术美术
gCode Teacher 格码致知2 小时前
Pandas教学-18:number与numeric的区别
python·pandas
梦想不只是梦与想5 小时前
Python 中subprocess 模块:执行外部命令
python·subprocess·调用外部命令
懂点Tech6 小时前
ctfshow MISC入门图片篇(信息附加):misc41解题思路
开发语言·python
catchadmin6 小时前
PHP 8.7 协程新提案 让跨协程代码共享请求身份
开发语言·php
念何架构之路7 小时前
go-grpc设计思想
开发语言·后端·golang
酷炫码神8 小时前
Day 10|Pinia 状态管理:把散落在各组件的数据,收进一个全局仓库
android·开发语言·javascript
Elastic 中国社区官方博客8 小时前
我们如何通过 70 多个拉取请求,将 OpenTelemetry Java agent 迁移到 invokedynamic
java·大数据·开发语言·elasticsearch·搜索引擎·全文检索·es
tyn1889 小时前
记录本地安装nacos服务的方法及异常
java·开发语言
步行cgn9 小时前
Spring MVC 视图机制的核心接口与类
java·开发语言·后端·spring·mvc