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,可考虑批量处理。
  • 若需更高性能,可使用第三方库如 ujsonorjson(非标准库,但兼容性好)。

总结

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

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

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

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

相关推荐
傻啦嘿哟1 小时前
某招聘平台爬虫:爬取招聘岗位数据,分析各城市薪资水平
开发语言·爬虫·python
2501_933670791 小时前
2026秋招量化分析岗技能栈:Python、SQL、统计建模、回测项目怎么准备
开发语言·python·sql
2601_962077601 小时前
python Dejavu库快速识别音频指纹实例探究
python·音乐识别·dejavu库·音频指纹识别·实例探究
科技苑1 小时前
如何用Python编程实现一个简单的Web爬虫?
人工智能·python
李少兄2 小时前
JavaScript 数据类型完全指南
开发语言·javascript·ecmascript
dayDayupbetter2 小时前
Visual C++ 2010安装与使用高手秘籍
python
隐擎fox2 小时前
深入理解网络传输层安全:TLS 指纹识别(JA3/JA4)原理与 Python 协议层检测实战
爬虫·python·网络协议·安全·网络安全·https
医疗信息化王工2 小时前
DataForge:基于 Python 的数据库批量导出 Excel 工具——从架构到部署的全流程实战
数据库·python·excel
Seoyoneh2 小时前
Agentic Workflow编排架构:云客服从“被动响应”迈向“主动执行”的技术实现
java·开发语言·架构
Tangyuewei3 小时前
Java 写 Agent:模型只是组件
java·开发语言