如何在Python中进行JSON数据的序列化和反序列化?

在Python中,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。Python内置的json模块提供了简单易用的方法来实现数据的序列化和反序列化。下面将详细介绍如何在Python中进行JSON数据的序列化和反序列化,并给出具体的示例。

1. 序列化

序列化是指将Python对象转换为JSON格式的字符串。json模块提供了两个主要的方法来实现这一过程:

  • 「json.dumps()」: 将Python对象转换为JSON格式的字符串。
  • 「json.dump()」: 将Python对象序列化为JSON格式并写入文件。
示例1:使用json.dumps()
复制代码
import json



# 定义一个Python字典

data = {

    "name": "张三",

    "age": 30,

    "is_employee": True,

    "skills": ["Python", "Java", "C++"]

}



# 将字典转换为JSON格式的字符串

json_data = json.dumps(data, ensure_ascii=False, indent=4)

print(json_data)

「输出结果:」

复制代码
{

    "name": "张三",

    "age": 30,

    "is_employee": true,

    "skills": [

        "Python",

        "Java",

        "C++"

    ]

}

「解释:」

  • ensure_ascii=False:确保中文字符不被转义为Unicode编码。
  • indent=4:设置输出格式的缩进,使JSON字符串更易读。
示例2:使用json.dump()
复制代码
import json



# 定义一个Python字典

data = {

    "name": "李四",

    "age": 25,

    "is_employee": False,

    "skills": ["JavaScript", "HTML", "CSS"]

}



# 将字典序列化为JSON格式并写入文件

with open('data.json', 'w', encoding='utf-8') as f:

    json.dump(data, f, ensure_ascii=False, indent=4)

「解释:」

  • with open('data.json', 'w', encoding='utf-8') as f: 以写模式打开文件,并指定编码为UTF-8。
  • json.dump(data, f, ensure_ascii=False, indent=4): 将字典序列化为JSON格式并写入文件。

2. 反序列化

反序列化是指将JSON格式的字符串转换回Python数据对象。json模块提供了两个主要的方法来实现这一过程:

  • 「json.loads()」: 将JSON格式的字符串解码为Python对象。
  • 「json.load()」: 从文件中读取JSON字符串并将其解码为Python对象。
示例3:使用json.loads()
复制代码
import json



# 定义一个JSON格式的字符串

json_data = '{"name": "王五", "age": 28, "is_employee": true, "skills": ["Go", "Rust"]}'



# 将JSON字符串转换为Python字典

data = json.loads(json_data)

print(data)

print(type(data))

「输出结果:」

复制代码
{'name': '王五', 'age': 28, 'is_employee': True, 'skills': ['Go', 'Rust']}

<class 'dict'>

「解释:」

  • json.loads(json_data): 将JSON字符串解码为Python对象。
示例4:使用json.load()
复制代码
import json



# 从文件中读取JSON字符串并将其解码为Python对象

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

    data = json.load(f)

print(data)

print(type(data))

「输出结果:」

复制代码
{'name': '李四', 'age': 25, 'is_employee': False, 'skills': ['JavaScript', 'HTML', 'CSS']}

<class 'dict'>

「解释:」

  • with open('data.json', 'r', encoding='utf-8') as f: 以读模式打开文件,并指定编码为UTF-8。
  • json.load(f): 从文件中读取JSON字符串并将其解码为Python对象。

3. 处理复杂对象

对于一些复杂的数据类型,如自定义类对象,直接进行序列化和反序列化可能会遇到问题。这时需要自定义编码器和解码器。

示例5:自定义编码器和解码器
复制代码
import json



class Contact:

    def __init__(self, name, phone):

        self.name  = name

        self.phone = phone



# 自定义编码器

class ContactEncoder(json.JSONEncoder):

    def default(self, obj):

        if isinstance(obj, Contact):

            return {'name': obj.name , 'phone': obj.phone}

        return super().default(obj)



# 自定义解码器

def decode_contact(dct):

    if 'name' in dct and 'phone' in dct:

        return Contact(dct['name'], dct['phone'])

    return dct



# 创建一个Contact对象

contact = Contact("赵六", "1234567890")



# 序列化Contact对象

json_data = json.dumps(contact, cls=ContactEncoder, ensure_ascii=False, indent=4)

print(json_data)



# 反序列化JSON字符串为Contact对象

decoded_contact = json.loads(json_data, object_hook=decode_contact)

print(decoded_contact.name , decoded_contact.phone)

「输出结果:」

复制代码
{

    "name": "赵六",

    "phone": "1234567890"

}

赵六 1234567890

「解释:」

  • ContactEncoder: 自定义编码器,继承自json.JSONEncoder,并重写了default方法来处理Contact类的对象。
  • decode_contact: 自定义解码器,用于将JSON对象转换为Contact类的对象。

4. 格式化输出

在序列化过程中,可以通过设置参数来控制输出格式,使其更易读。

示例6:格式化输出
复制代码
import json



# 定义一个Python字典

data = {

    "name": "孙七",

    "age": 22,

    "is_employee": True,

    "skills": ["Python", "Django", "Flask"]

}



# 将字典转换为JSON格式的字符串,并设置缩进和排序键

json_data = json.dumps(data, ensure_ascii=False, indent=4, sort_keys=True)

print(json_data)

「输出结果:」

复制代码
{

    "age": 22,

    "is_employee": true,

    "name": "孙七",

    "skills": [

        "Django",

        "Flask",

        "Python"

    ]

}

「解释:」

  • sort_keys=True: 按照键的字母顺序对字典进行排序。

5. 数据类型转换对应表

在Python中,不同的数据类型在序列化和反序列化过程中会对应不同的JSON数据类型。以下是Python与JSON之间的数据类型转换对应表:

Python数据类型 JSON数据类型
dict object
list array
tuple array
str string
int number
float number
bool true/false
None null

总结

通过上述内容,我们可以看到Python中的json模块提供了简单且强大的方法来实现数据的序列化和反序列化。无论是将Python对象转换为JSON格式的字符串,还是将JSON字符串转换回Python对象,都可以通过json.dumps()、json.dump()、json.loads()和json.load()方法轻松完成。对于复杂的数据类型,还可以通过自定义编码器和解码器来实现序列化和反序列化。通过这些方法,可以有效地在Python中处理和存储数据,无论是内存中的对象还是文件中的数据。

相关推荐
励志不掉头发的内向程序员1 分钟前
【从零写一个CAD 02】画完第一条线之后:实体容器、Esc 取消,和按了没反应的键盘
开发语言·c++·qt·学习·系统架构
摇滚侠11 分钟前
《On Java 中文版 基础卷》阅读笔记 安装 Java 和本书示例 02
java·开发语言·笔记
FfHUCisI22 分钟前
sync.Once 与 sync.Cond 源码与并发控制陷阱
服务器·开发语言·后端·golang
阿钱真强道26 分钟前
21 嵌入式操作系统 | JSON 与 json-c:生成与解析
c语言·开发语言·json·json-c
j7~27 分钟前
【Python】(篇六)《基础语法(函数、列表和元组、字典、文件)》---详解
开发语言·python·文件·函数·字典·编程学习·元组与列表
重生之小比特39 分钟前
【C++进阶】红黑树的实现
java·开发语言·c++
纪念 22940 分钟前
C++算法(一)
开发语言·c++·算法
Wx-bishekaifayuan1 小时前
springboot户外登山社交小程序19787-计算机课程设计、毕业设计
spring boot·后端·python·spring·elasticsearch·django·课程设计
FYKJ_20101 小时前
springboot刑事案件管理系统03047-计算机课程设计、毕业设计
vue.js·spring boot·python·mysql·typescript·spark·django
Python图像识别2 小时前
18-【2027毕设】YOLO11烟雾检测识别系统 - Python完整源码+PyQt5界面+训练模型+数据集
python·深度学习·yolo·毕业设计·毕设