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 模块

相关推荐
Elias不吃糖9 小时前
Java Lambda 表达式
java·开发语言·学习
梨子串桃子_9 小时前
推荐系统学习笔记 | PyTorch学习笔记
pytorch·笔记·python·学习·算法
guygg889 小时前
一级倒立摆MATLAB仿真程序
开发语言·matlab
情缘晓梦.9 小时前
C语言指针进阶
java·开发语言·算法
世转神风-10 小时前
qt-字符串版本与数值版本互转
开发语言·qt
极客代码10 小时前
深入解析C语言中的函数指针:原理、规则与实践
c语言·开发语言·指针·状态机·函数·函数指针
文言一心10 小时前
LINUX离线升级 Python 至 3.11.9 操作手册
linux·运维·python
w-w0w-w10 小时前
C++模板参数与特化全解析
开发语言·c++