对象的序列化和反序列化

news2024/11/19 4:30:22

读写JSON格式的数据

通过上面的讲解,我们已经知道如何将文本数据和二进制数据保存到文件中,那么这里还有一个问题,如果希望把一个列表或者一个字典中的数据保存到文件中又该怎么做呢?在Python中,我们可以将程序中的数据以JSON格式进行保存。JSON是“JavaScript Object Notation”的缩写,它本来是JavaScript语言中创建对象的一种字面量语法,现在已经被广泛的应用于跨语言跨平台的数据交换。使用JSON的原因非常简单,因为它结构紧凑而且是纯文本,任何操作系统和编程语言都能处理纯文本,这就是实现跨语言跨平台数据交换的前提条件。目前JSON基本上已经取代了XML(可扩展标记语言)作为异构系统间交换数据的事实标准。可以在JSON的官方网站找到更多关于JSON的知识,这个网站还提供了每种语言处理JSON数据格式可以使用的工具或三方库。

  下面是JSON格式的一个简单例子,大家可能已经注意到了,它跟Python中的字典非常类似而且支持嵌套结构,就像Python字典中的值还可以是字典,如果我们把下面的代码输入到浏览器控制台中,它会创建出一个JavaScript中的对象。

{
    "name": "骆昊",
    "age": 40,
    "friends": ["王大锤", "白元芳"],
    "cars": [
        {"brand": "BMW", "max_speed": 240},
        {"brand": "Benz", "max_speed": 280},
        {"brand": "Audi", "max_speed": 280}
    ]
}
复制代码

JSON格式的数据类型和Python中的数据类型也是很容易找到对应关系的,正如下面的两张表所示。

在Python中,我们可以使用json模块将字典或列表以JSON格式写入到文件中,代码如下所示。

import json

my_dict = {
    'name': '骆昊',
    'age': 40,
    'friends': ['王大锤', '白元芳'],
    'cars': [
        {'brand': 'BMW', 'max_speed': 240},
        {'brand': 'Audi', 'max_speed': 280},
        {'brand': 'Benz', 'max_speed': 280}
    ]
}
with open('data.json', 'w') as file:
    json.dump(my_dict, file)
print('字典已经保存到data.json文件中')
复制代码

执行上面的代码,会创建data.json文件,文件的内容如下所示,中文是用Unicode编码书写的。

{"name": "\u9a86\u660a", "age": 40, "friends": ["\u738b\u5927\u9524", "\u767d\u5143\u82b3"], "cars": [{"brand": "BMW", "max_speed": 240}, {"brand": "Audi", "max_speed": 280}, {"brand": "Benz", "max_speed": 280}]}
复制代码

json模块有四个比较重要的函数,分别是:

  • dump - 将Python对象按照JSON格式序列化到文件中
  • dumps - 将Python对象处理成JSON格式的字符串
  • load - 将文件中的JSON数据反序列化成对象
  • loads - 将字符串的内容反序列化成Python对象

这里出现了两个概念,一个叫序列化,一个叫反序列化,维基百科上的解释是:“序列化(serialization)在计算机科学的数据处理中,是指将数据结构或对象状态转换为可以存储或传输的形式,这样在需要的时候能够恢复到原先的状态,而且通过序列化的数据重新获取字节时,可以利用这些字节来产生原始对象的副本(拷贝)。与这个过程相反的动作,即从一系列字节中提取数据结构的操作,就是反序列化(deserialization)”。

我们可以通过下面的代码,从上面创建的data.json文件中读取JSON格式的数据并还原成字典。

import json

with open('data.json', 'r') as file:
    my_dict = json.load(file)
    print(type(my_dict))
    print(my_dict)
复制代码

包管理工具pip的使用

Python标准库中的json模块在数据序列化和反序列化时性能并不是非常理想,为了解决这个问题,可以使用三方库ujson来替换json。所谓三方库,是指非公司内部开发和使用的,也不是来自于官方标准库的Python模块,这些模块通常由其他公司、组织或个人开发,所以被称为三方库。虽然Python语言的标准库虽然已经提供了诸多模块来方便我们的开发,但是对于一个强大的语言来说,它的生态圈一定也是非常繁荣的。

之前安装Python解释器时,默认情况下已经勾选了安装pip,大家可以在命令提示符或终端中通过pip --version来确定是否已经拥有了pip。pip是Python的包管理工具,通过pip可以查找、安装、卸载、更新Python的三方库或工具,macOS和Linux系统应该使用pip3。例如要安装替代json模块的ujson,可以使用下面的命令。

pip install ujson
复制代码

在默认情况下,pip会访问pypi.org/simple/来获得三…

pip install ujson -i https://pypi.doubanio.com/simple
复制代码

可以通过pip search命令根据名字查找需要的三方库,可以通过pip list命令来查看已经安装过的三方库。如果想更新某个三方库,可以使用pip install -U或pip install --upgrade;如果要删除某个三方库,可以使用pip uninstall命令。

搜索ujson三方库。

pip search ujson
micropython-cpython-ujson (0.2)  - MicroPython module ujson ported to CPython
pycopy-cpython-ujson (0.2)       - Pycopy module ujson ported to CPython
ujson (3.0.0)                    - Ultra fast JSON encoder and decoder for Python
ujson-bedframe (1.33.0)          - Ultra fast JSON encoder and decoder for Python
ujson-segfault (2.1.57)          - Ultra fast JSON encoder and decoder for Python. Continuing 
                                   development.
ujson-ia (2.1.1)                 - Ultra fast JSON encoder and decoder for Python (Internet 
                                   Archive fork)
ujson-x (1.37)                   - Ultra fast JSON encoder and decoder for Python
ujson-x-legacy (1.35.1)          - Ultra fast JSON encoder and decoder for Python
drf_ujson (1.2)                  - Django Rest Framework UJSON Renderer
drf-ujson2 (1.6.1)               - Django Rest Framework UJSON Renderer
ujsonDB (0.1.0)                  - A lightweight and simple database using ujson.
fast-json (0.3.2)                - Combines best parts of json and ujson for fast serialization
decimal-monkeypatch (0.4.3)      - Python 2 performance patches: decimal to cdecimal, json to 
                                   ujson for psycopg2
复制代码

查看已经安装的三方库。

pip list
Package                       Version
----------------------------- ----------
aiohttp                       3.5.4
alipay                        0.7.4
altgraph                      0.16.1
amqp                          2.4.2
...                           ...
复制代码

更新ujson三方库。

pip install -U ujson -i https://pypi.doubanio.com/simple
复制代码

如果要更新pip本身,可以使用下面的命令。

macOS系统:

pip3 install -U pip
复制代码

Windows系统:

python -m pip install -U pip
复制代码

删除ujson三方库。

pip uninstall -y ujson
复制代码

使用网络API获取数据

如果想在我们自己的程序中显示天气、路况、航班等信息,这些信息我们自己没有能力提供,所以必须使用网络数据服务。目前绝大多数的网络数据服务(或称之为网络API)都是基于HTTP提供JSON格式的数据,在Python程序中,我们可以发送HTTP请求给指定的URL(统一资源定位符),这个URL就是所谓的网络API,如果请求成功,它会返回HTTP响应,而HTTP响应的消息体中就有我们需要的JSON格式的数据。关于HTTP的相关知识,可以自己找找书!

国内有很多提供网络API接口的网站,例如聚合数据、阿凡达数据等,这些网站上有免费的和付费的数据接口,国外的{API}Search网站也提供了类似的功能,有兴趣的可以自行研究。下面的例子演示了如何使用requests库(基于HTTP进行网络资源访问的三方库)访问网络API获取国内新闻并显示新闻标题和链接,这个例子使用了天行数据提供的国内新闻数据接口,其中的APIKey需要自己到网站上注册申请。

安装requests库。

pip install requests -i https://pypi.doubanio.com/simple/
复制代码

获取国内新闻并显示新闻标题和链接。

import requests

resp = requests.get('http://api.tianapi.com/guonei/?key=APIKey&num=10')
if resp.status_code == 200:
    data_model = resp.json()
    for news in data_model['newslist']:
        print(news['title'])
        print(news['url'])
        print('-' * 60)
复制代码

注意:上面代码中的APIKey需要换成自己在天行数据网站申请的APIKey,同时还要申请开通国内新闻的接口才能获取到JSON格式的数据。这个网站上还有很多非常有意思的网络API接口,例如:垃圾分类、美女图片、周公解梦等等,大家可以仿照上面的代码来调用这些接口。

简单的总结

Python中实现序列化和反序列化除了使用json模块之外,还可以使用pickle和shelve模块,但是这两个模块是使用特有的序列化协议来序列化数据,因此序列化后的数据只能被Python识别,关于这两个模块的相关知识可以自己看看网络上的资料。处理JSON格式的数据很显然是程序员必须掌握的一项技能,因为不管是访问网络API接口还是提供网络API接口给他人使用,都需要具备处理JSON格式数据的相关知识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/191795.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

方向梯度直方图(HOG)

摘要: 方向梯度直方图(HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述。HOG特征通过计算和统计图像局部区域的梯度方向直方图来构成特征。主要用于解决人体目标检测,主要通过梯度方向直方图特征来表达人体,提取人体的外…

OpenMMLab AI实战营Day1 计算机视觉算法基础与 OpenMMLab

目录 一、计算机视觉任务 二、计算机视觉的应用 三、计算机视觉的发展 四、OpenMMLab介绍 一、计算机视觉任务 计算机视觉三大基础任务:分类、检测、分割。 分割分为两种:语义分割(Semantic Segmentation)、实例分割&#xff08…

【Node.js实战】一文带你开发博客项目之Express重构(博客的增删查改、morgan写日志)

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,也会涉及到服务端 📃个人状态: 在校大学生一枚,已拿多个前端 offer(秋招) 🚀未…

Java之并发编程(二)

二、Java内存模型(重要) 1. CPU缓存模型 1.1 CPU缓存 CPU缓存是为了解决 CPU处理速度和内存处理速度不对等的问题。(类比:缓存如Redis是为了解决程序处理速度和访问常规关系型数据库速度不对等的问题) 内存缓存是为…

UDS诊断系列介绍16-DTC状态位介绍

本文框架1. 系列介绍2.各状态位逻辑介绍2.0 Bit0(TestFailed)置位逻辑2.1 Bit1(TestFailedThisOperationCycle)置位逻辑2.2 Bit2(PendingDTC)置位逻辑2.3 Bit3(ConfirmedDTC)置位逻辑2.4 Bit4(TestNotCompletedSinceLastClear)置位逻辑2.5 Bit5(TestFailedSinceLastClear)置位逻…

网站排名下降怎么恢复(网站降权的原因如何知道)

网站降权后恢复网站排名的方法 对于我们很多SEO新手来说,降权可能是不可避免的,但很多时候是因为我们的无知或粗心大意导致网站降权,从延长排名周期到导致网站进入沙盒效应,所以我们的网站降权后并非无法恢复。很多时候&#xff…

【逆向分析】静态分析_Navtive_小计

静态分析so小计 源APK https://github.com/eternalsakura/ctf_pwn/blob/master/android%E9%80%86%E5%90%91/mobicrackNDK.apk jadx 通过源码发现关键函数在 public native boolean testFlag(String str);static {System.loadLibrary("mobicrackNDK");}所以要看na…

【C++】入门(上)

本期博客给大家带来的全是干货,慢慢享用吧~C入门主要是一些对C语言不足的语法补充,废话不多说直接上干货:一、C的输出和输入1.1 输出在C上我们要想在屏幕(控制台)上进行一些内容的输出可以使用关键字:cout具…

MoCo解读

MoCo方法由何凯明团队提出,是无监督对比学习的代表作。经过MoCo预训练的视觉表征迁移到各种下游任务时,其效果超过了有监督预训练模型。 两点创新 对比学习的思想是将相似的样本距离拉近,不相似的样本距离拉远。对比学习主要在两方面进行设计…

JavaEE13-MyBatis查询数据库

前言:前面已经学习了Spring,Spring Boot,Spring MVC这3个框架,接下来学习第4个框架MyBatis(国内):将前端传递的数据存储起来(前身IBatis)或者查询数据库里面的数据。PS:不同版本号区别3.5.1 -> 3.5的第一个版本3.5.10 -> 3.…

命令执行利用

数据来源 01 命令执行漏洞 命令执行漏洞- 例子1(无防御) 示例:(我这里使用dvwa靶场做演示) 解决靶场响应结果的中文乱码 charsetutf-8,修改为charsetgb2312 把安全等级调到:low&#xff0…

concat函数在mySQL和Oracle中的不同

在mysql中的使用1>.在该函数中传入两个值:22和33,得到结果为两个值的拼接效果如图所示2>.在该函数中传入两个及以上的值:22和33和44,得到结果为多个值的拼接效果如图所示3>.在该函数中传入两个及以上的值:null和22和33,得…

GitHub 上有哪些优秀的项目?

前言 各个领域模块的都整理了一下,包含游戏、一些沙雕的工具、实用正经的工具以及一些相关的电商项目,希望他们可以给你学习的路上增加几分的乐趣,我们直接进入正题~ 游戏 1.吃豆人 一款经典的游戏开发案例,包括地图绘制、玩家控…

车载网络 - BootLoader - CAN/CANFD刷写过程

话接上回,我们继续分享刷写流程。 刷写Boot到RAM(如果ECU中有独立的boot代码,无需执行此段) 9、获取单次刷写的最大长度(参考https://mp.csdn.net/mp_blog/creation/editor/127720716) Request:34 00 44 + 地址 + 长度 Response:74 00 44 + Maxlength 10、进行刷写传…

Netty之DefaultAttributeMap与AttributeKey的机制和原理

为什么要分析DefaultAttributeMap和AttributeKey呢?我自己对Netty也是一个不断的学习过程,从前面几篇Netty分析的博客中,可以看出,Netty是比较博大精深的,很像java.util.concurrent.*包中的源码,如果只是看…

【微电网】微电网的分布式电源优化配置研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

企业工程管理系统源码-专注项目数字化管理

高效的工程项目管理软件不仅能够提高效率还应可以帮你节省成本提升利润 在工程行业中,管理不畅以及不良的项目执行,往往会导致项目延期、成本上升、回款拖后,最终导致项目整体盈利下降。企企管理云业财一体化的项目管理系统,确保项…

关于卷积过程中通道数如何变化问题

以RGB图像为例。 一个12*12的像素图,对其进行5*5的卷积,最后得到一个8*8【计算过程:(12-5)/118】的像素图。 RGB图像有3个通道(12*12*3),所以卷积核也要有3个通道(5*5*3)&am…

第一章 隐私计算科普与解读

前言 提醒:全文10千字,预计阅读时长15分钟;读者:对隐私计算感兴趣的小伙伴;目的:读者利用15~30 分钟对本文沉浸式阅读理解,能够掌握隐私计算 80% 的概念;关键词 :隐私计算…

好用的搜索工具listary

发现一个好工具记录一下。以后好好用起来。 这个工具我安装后,跟着引导教程,学做了一些操作立马就爱上了。 Listary:大幅度提高本地文件浏览与搜索速度效率的「超级神器」 百度安全验证https://baijiahao.baidu.com/s?id17127561426219890…