当前位置: 首页 > news >正文

如何在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 jsonclass Contact:def __init__(self, name, phone):self.name  = nameself.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数据类型
dictobject
listarray
tuplearray
strstring
intnumber
floatnumber
booltrue/false
Nonenull

总结

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

相关文章:

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

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

学习记录-统计记录场景下的Redis写请求合并优化实践

学习记录-使用Redis合并写请求来优化性能 1.业务背景 学习进度的统计功能:为了更精确的记录用户上一次播放的进度,采用的方案是:前端每隔15秒就发起一次请求,将播放记录写入数据库。但问题是,提交播放记录的业务太复杂了&#x…...

网站HTTP改成HTTPS

您不仅需要知道如何将HTTP转换为HTTPS,还必须在不妨碍您的网站自成立以来建立的任何搜索排名权限的情况下进行切换。 为什么应该从HTTP转换为HTTPS? 与非安全HTTP于不同,安全域使用SSL(安全套接字层)服务器上的加密代…...

如何在龙蜥 OS(AliOS)上安装极狐GitLab?

本文分享如何在龙蜥操作系统(AliOS)(包括 RHCK 和 ANCK 两种,两种方式的安装流程一样)上安装极狐GitLab? 前提条件 一个安装了龙蜥操作系统的云服务器 可以查看 /etc/os-release中的信息,确认…...

unity插件Excel转换Proto插件-ExcelToProtobufferTool

unity插件Excel转换Proto插件-ExcelToProtobufferTool **ExcelToProtobufTool 插件文档****1. 插件概述****2. 默认配置类:DefaultIProtoPathConfig****属性说明** **3. 自定义配置类****定义规则****示例代码** **4. 使用方式****4.1 默认路径****4.2 自定义路径**…...

C#中的语句

C#提供了各式各样的语句,大多数是由C和C发展而来,当然,在C#中做了相应修改。语句和表达式一样,都是C#程序的基本组成部分,在本文我们来一起学习C#语句。 1.语句 语句是构造所有C#程序的过程构造块。在语句中可以声明…...

《罗宾逊-旅途VR》Build2108907官方学习版

《罗宾逊-旅途VR》官方版 https://pan.xunlei.com/s/VODiY5gn_fNxKREdVRdwVboCA1?pwdsh3f# 从第一人称的角度进行探索,玩家将遇到一系列恐龙和生物,这些恐龙和生物会对它们在泰森三世生态系统中的存在做出反应。强调与周围环境的互动,鼓励玩…...

常用的跨域方案有哪些?

在前端开发中,跨域(Cross-Origin)是一个常见问题,通常是由于浏览器的同源策略(Same-Origin Policy)限制导致的。为了解决跨域问题,前端开发者可以采用多种方案。 1. CORS(跨域资源共…...

JDBC实验测试

一、语言和环境 实现语言:Java。 环境要求:IDEA2023.3、JDK 17 、MySQL8.0、Navicat 16 for MySQL。 二、技术要求 该系统采用 SWING 技术配合 JDBC 使用 JAVA 编程语言完成桌面应用开发。 三、功能要求 某电商公司为了方便客服查看用户的订单信…...

ChatGPT 摘要,以 ESS 作为你的私有数据存储

作者:来自 Elastic Ryan_Earle 本教程介绍如何设置 Elasticsearch 网络爬虫,将网站索引到 Elasticsearch 中,然后利用 ChatGPT 使用我们的私人数据来总结对其提出的问题。 Python 脚本的 Github Repo:https://github.com/Gunner…...

每日一题洛谷P2669 [NOIP2015 普及组] 金币c++

#include<iostream> using namespace std; int main() {int k;cin >> k;int sum 0;int n 1;while (k > 0) {sum n * n;k - n;n;}sum k * (n - 1);cout << sum << endl;return 0; }...

【C语言系列】深入理解指针(2)

一、数组名的理解 上一篇文章中我们写过一个这样的代码&#xff1a; int arr[10] {1,2,3,4,5,6,7,8,9,10}; int *p &arr[0];这里使用&arr[0] 的方式拿到了数组第⼀个元素的地址&#xff0c;但是其实数组名本来就是地址&#xff0c;而且是数组首元素的地址&#xff…...

与 Spring Boot 的无缝集成:ShardingSphere 快速集成实践

ShardingSphere 是一个轻量级的开源分布式数据库中间件&#xff0c;它支持分库分表、分布式事务、读写分离等功能。它能够与各种应用框架进行集成&#xff0c;其中与 Spring Boot 的集成非常流行&#xff0c;因为它能够帮助开发者在 Spring Boot 项目中快速实现高性能的分布式数…...

【QT】窗口/界面置于最前端显示,且激活该窗口

目录 0.环境 1.问题描述 2.具体实现 0.环境 windows11 qt 1.问题描述 我有一个窗口QMainWindow&#xff08;也适用于QWidget或QDialog&#xff09;&#xff0c;想让其在显示的时候置于最前面&#xff0c;且激活成为当前活动窗口 2.具体实现 mainWindow->show();mainWind…...

DOL-288 多功能电子计时器说明书

新买一个计时器&#xff0c;它的用法不太直观&#xff0c;所以把说明书留在这里&#xff0c;以便以后查询。 DOL-288 多功能电子计时器说明书 1.功能说明&#xff1a; 正计时功能&#xff0c;计时上限为23小时59分59秒倒计时功能&#xff0c;计时上限为23小时59分59秒&#…...

14 常用的负载均衡算法

基于nginx的代理 1. 轮询算法 例如我们在nginx服务器中代理了3台服务器&#xff0c;再每次客户端发起请求的时候按照顺序请求挨次的发送到代理的三台服务器上。该算法比较适合每台服务器性能差不多的场景&#xff0c;如果部分服务器性能比较差&#xff0c;可能会造成性能好的…...

方法建议ChatGPT提示词分享

方法建议 ChatGPT能够根据您的具体需求提供针对性的建议&#xff0c;帮助您选择最合适的研究方法。通过清晰的提示&#xff0c;ChatGPT可以精准地为您提供最契合的研究方案。此外&#xff0c;它还能协助您将这些方法灵活地应用于新的研究环境&#xff0c;提出创新的技术解决方案…...

如何提高自动化测试覆盖率和效率

用ChatGPT做软件测试 在现代软件开发中&#xff0c;自动化测试已经成为保证软件质量的重要手段。然而&#xff0c;在实践中&#xff0c;自动化测试的覆盖率和效率常常受到限制&#xff0c;导致潜在缺陷未能及时发现或测试资源浪费。因此&#xff0c;提升自动化测试的覆盖率和效…...

Django学习笔记(安装和环境配置)-01

Django学习笔记(安装和环境配置)-01 一、创建python环境 1、可以通过安装Anaconda来创建一个python环境 # 创建一个虚拟python环境 conda create -n django python3.8 # 切换激活到创建的环境中 activate django2、安装django # 进入虚拟环境中安装django框架 pip install …...

【PHP】部署和发布PHP网站到IIS服务器

欢迎来到《小5讲堂》 这是《PHP》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言安装PHP 稳定版本线程安全版解压使用 PHP配置 配置文件扩展文件…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

elementUI点击浏览table所选行数据查看文档

项目场景&#xff1a; table按照要求特定的数据变成按钮可以点击 解决方案&#xff1a; <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...

Spring Boot + MyBatis 集成支付宝支付流程

Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例&#xff08;电脑网站支付&#xff09; 1. 添加依赖 <!…...

LangChain【6】之输出解析器:结构化LLM响应的关键工具

文章目录 一 LangChain输出解析器概述1.1 什么是输出解析器&#xff1f;1.2 主要功能与工作原理1.3 常用解析器类型 二 主要输出解析器类型2.1 Pydantic/Json输出解析器2.2 结构化输出解析器2.3 列表解析器2.4 日期解析器2.5 Json输出解析器2.6 xml输出解析器 三 高级使用技巧3…...

Cursor AI 账号纯净度维护与高效注册指南

Cursor AI 账号纯净度维护与高效注册指南&#xff1a;解决限制问题的实战方案 风车无限免费邮箱系统网页端使用说明|快速获取邮箱|cursor|windsurf|augment 问题背景 在成功解决 Cursor 环境配置问题后&#xff0c;许多开发者仍面临账号纯净度不足导致的限制问题。无论使用 16…...