【测试语言篇四】Python进阶篇之json模块

一、json模块介绍

JSON(JavaScript对象表示法)是一种轻量级数据格式,用于数据交换。 在Python中具有用于编码和解码JSON数据的内置 json 模块。 只需导入它,就可以使用JSON数据了:

import json

JSON的一些优点:

  • JSON作为“字节序列”存在,在我们需要通过网络传输(流)数据的情况下非常有用。
  • 与XML相比,JSON小得多,可转化为更快的数据传输和更好的体验。
  • JSON非常文本友好,因为它是文本形式的,并且同时也是机器友好的。

信息表示格式为:

  • 数据在名称 / 值对中。
  • 数据由逗号分隔。
  • 大括号保存对象。
  • 方括号保存数组。

JSON格式

{"firstName": "Jane","lastName": "Doe","hobbies": ["running", "swimming", "singing"],"age": 28,"children": [{"firstName": "Alex","age": 5},{"firstName": "Bob","age": 7}]
}

JSON支持基本类型(字符串,数字,布尔值)以及嵌套的数组和对象。 根据以下转换,将简单的Python对象转换为JSON:

|Python|JSON| |—|—| |dict|object| |”list, tuple”|array| |str|string| |”int, long, float”|number| |True|true| |False|false| |None|null|

二、从Python到JSON(序列化,编码)

使用 json.dumps() 方法将Python对象转换为JSON字符串。函数原型如下:

json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)

其中,obj表示需要序列化的json对象,其他参数用于控制序列化过程。常用参数解释如下:
参数名 | 含义
------- | -------
skipkeys| 如果遇到某些非法格式的Python数据类型,则抛出TypeError异常。如果skipkeys为True,这些非法格式的数据类型将被跳过,不会引发TypeError异常,默认值为False。
ensure_ascii| 默认True,它保证输出的每个字符都是ASCII字符。如果有些字符不能被编码成ASCII字符,它们会被转义为Unicode转义字符。
indent| 顾名思义,这个参数用于控制缩进格式。如果它的值是一个非负整数,输出的JSON字符串就会分行缩进,而且每次缩进两个空格。如果它的值为None,默认不缩进。

separators| 序列化之后的字符串中不同部分的分隔符。默认为(‘,’, ‘:’)。

sort_keys| 用于指定是否按照键进行排序,默认为False。

import jsonperson = {"name": "John", "age": 30, "city": "New York", "hasChildren": False, "titles": ["engineer", "programmer"]}# 转为 JSON:
person_json = json.dumps(person)
# 使用不用的格式
person_json2 = json.dumps(person, indent=4, separators=("; ", "= "), sort_keys=True)# 结果为 JSON 字符串
print(person_json) 
print(person_json2)
    {"name": "John", "age": 30, "city": "New York", "hasChildren": false, "titles":["engineer", "programmer"]}{"age"= 30; "city"= "New York"; "hasChildren"= false; "name"= "John"; "titles"= ["engineer"; "programmer"]}

或将Python对象转换为JSON对象,然后使用 json.dump() 方法将其保存到文件中。

import jsonperson = {"name": "John", "age": 30, "city": "New York", "hasChildren": False, "titles": ["engineer", "programmer"]}with open('person.json', 'w') as f:json.dump(person, f) # 你也可以设置缩进等

三、从JSON到Python(反序列化,解码)

使用 json.loads() 方法将JSON字符串转换为Python对象。 结果将是一个Python字典。

import json
person_json = """
{"age": 30, "city": "New York","hasChildren": false, "name": "John","titles": ["engineer","programmer"]
}
"""
person = json.loads(person_json)
print(person){'age': 30, 'city': 'New York', 'hasChildren': False, 'name': 'John', 'titles': ['engineer', 'programmer']}
或从文件加载数据,然后使用 json.load()方法将其转换为Python对象。import jsonwith open('person.json', 'r') as f:person = json.load(f)print(person)
    {'name': 'John', 'age': 30, 'city': 'New York', 'hasChildren': False, 'titles': ['engineer', 'programmer']}

使用自定义对象

编码

使用默认的 JSONEncoder 编码自定义对象将引发 TypeError。 我们可以指定一个自定义的编码函数,该函数将类名和所有对象变量存储在字典中。 将此函数用作 json.dump() 方法中的 default 参数。

import json
def encode_complex(z):if isinstance(z, complex):# 只是类名的键很重要,值可以是任意的。return {z.__class__.__name__: True, "real":z.real, "imag":z.imag}else:raise TypeError(f"Object of type '{z.__class__.__name__}' is not JSON serializable")z = 5 + 9j
zJSON = json.dumps(z, default=encode_complex)
print(zJSON)
    {"complex": true, "real": 5.0, "imag": 9.0}

你还可以创建一个自定义的 Encoder 类,并覆盖 default() 方法。 将其用于 json.dump() 方法中的 cls 参数,或直接使用编码器。

from json import JSONEncoder
class ComplexEncoder(JSONEncoder):def default(self, o):if isinstance(z, complex):return {z.__class__.__name__: True, "real":z.real, "imag":z.imag}# 让基类的默认方法处理其他对象或引发TypeErrorreturn JSONEncoder.default(self, o)z = 5 + 9j
zJSON = json.dumps(z, cls=ComplexEncoder)
print(zJSON)
# 或者直接使用编码器
zJson = ComplexEncoder().encode(z)
print(zJSON)
    {"complex": true, "real": 5.0, "imag": 9.0}{"complex": true, "real": 5.0, "imag": 9.0}

解码

可以使用默认 JSONDecoder 解码自定义对象,但是它将被解码为字典。 编写一个自定义解码函数,该函数将以字典作为输入,并在可以在字典中找到对象类名称的情况下创建自定义对象。 将此函数用于 json.load() 方法中的 object_hook 参数。

# 可能但解码为字典
z = json.loads(zJSON)
print(type(z))
print(z)def decode_complex(dct):if complex.__name__ in dct:return complex(dct["real"], dct["imag"])return dct# 现在,对象在解码后的类型为complex
z = json.loads(zJSON, object_hook=decode_complex)
print(type(z))
print(z)
    <class 'dict'>{'complex': True, 'real': 5.0, 'imag': 9.0}<class 'complex'>(5+9j)

模板编码和解码函数

如果在 __init__ 方法中提供了所有类变量,则此方法适用于所有自定义类。

class User:# 自定义类在 __init__() 中包含所有类变量def __init__(self, name, age, active, balance, friends):self.name = nameself.age = ageself.active = activeself.balance = balanceself.friends = friendsclass Player:# 其他自定义类def __init__(self, name, nickname, level):self.name = nameself.nickname = nicknameself.level = leveldef encode_obj(obj):"""接受一个自定义对象,并返回该对象的字典表示形式。 此字典表示形式还包括对象的模块和类名称。"""# 用对象元数据填充字典obj_dict = {"__class__": obj.__class__.__name__,"__module__": obj.__module__}# 用对象属性填充字典obj_dict.update(obj.__dict__)return obj_dictdef decode_dct(dct):"""接受字典并返回与该字典关联的自定义对象。它利用字典中的 "__module__" 和 "__class__" 元数据来了解要创建的对象类型。"""if "__class__" in dct:# Pop ensures we remove metadata from the dict to leave only the instance argumentsclass_name = dct.pop("__class__")# Get the module name from the dict and import itmodule_name = dct.pop("__module__")# We use the built in __import__ function since the module name is not yet known at runtimemodule = __import__(module_name)# Get the class from the moduleclass_ = getattr(module,class_name)# Use dictionary unpacking to initialize the object# Note: This only works if all __init__() arguments of the class are exactly the dict keysobj = class_(**dct)else:obj = dctreturn obj# User 类适用于我们的编码和解码方法
user = User(name = "John",age = 28, friends = ["Jane", "Tom"], balance = 20.70, active = True)userJSON = json.dumps(user,default=encode_obj,indent=4, sort_keys=True)
print(userJSON)user_decoded = json.loads(userJSON, object_hook=decode_dct)
print(type(user_decoded))# Player 类也适用于我们的编码和解码方法
player = Player('Max', 'max1234', 5)
playerJSON = json.dumps(player,default=encode_obj,indent=4, sort_keys=True)
print(playerJSON)player_decoded = json.loads(playerJSON, object_hook=decode_dct)
print(type(player_decoded))
    {"__class__": "User","__module__": "__main__","active": true,"age": 28,"balance": 20.7,"friends": ["Jane","Tom"],"name": "John"}<class '__main__.User'>{"__class__": "Player","__module__": "__main__","level": 5,"name": "Max","nickname": "max1234"}<class '__main__.Player'>

四、总结

        Python的JSON模块是一个内置标准库,是python标准库中不可或缺的一部分,可以方便地将python中的数据转换为JSON格式数据,并支持将JSON格式数据转换为python中的数据类型。同时,json模块也支持自定义转换过程,以满足更加复杂的应用场景。
        JSON模块中主要的函数有:dumps()、dump()、loads()和load()。其中dumps()函数将Python内置数据类型转换为JSON字符串,dump()函数将Python内置数据类型转换为JSON格式数据并输出到文件中,loads()函数将JSON字符串转化为Python内置数据类型,load()函数将文件中的JSON格式数据转化为Python内置数据类型。
除此之外,JSON模块中的其他函数还包括:Python对象转化为JSON对象。
        在使用JSON模块的过程中,需注意JSON的标准格式。同时,JSON模块在对Python内置数据类型进行解析或者生成数据时,会调用特定对象的 json() 方法,所以在使用JSON模块的时候,需要注意Python对象的定义,尽量满足 json() 方法的调用要求,以实现更好的数据序列化与反序列化效果。

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

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

相关文章

书生第四期实训营基础岛——L1G2000 玩转书生「多模态对话」与「AI搜索」产品

基础任务 MindSearch使用示例 书生浦语使用示例 书生万象使用示例 进阶任务 问题&#xff1a;目前生成式AI在学术和工业界有什么最新进展&#xff1f; 回答截图&#xff1a; 知乎回答链接&#xff1a;目前生成式AI在学术和工业界有什么最新进展&#xff1f;

ReactPress:重塑内容管理的未来

ReactPress Github项目地址&#xff1a;https://github.com/fecommunity/reactpress 欢迎提出宝贵的建议&#xff0c;欢迎一起共建&#xff0c;感谢Star。 ReactPress&#xff1a;重塑内容管理的未来 在当今信息爆炸的时代&#xff0c;一个高效、易用的内容管理系统&#xff0…

短视频矩阵系统源码/抖去推源头技术4年开发

#短视频矩阵系统# #短视频矩阵系统源码# #短视频矩阵系统源码开发# #短视频矩阵系统源头技术开发# 抖音短视频矩阵系统集成开发是指利用抖音平台的开放接口和API&#xff0c;构建一个系统&#xff0c;该系统能够管理多个抖音矩阵账号&#xff0c;实现内容的统一发布、账号管理、…

CJ/T188-2004 报文举例

CJ/T188-2004 报文举例 # 读水表地址 # 请求报文&#xff1a; FE FE FE FE 68 AA AA AA AA AA AA AA AA 03 03 81 0A 00 49 16FE FE FE FE &#xff1a;前导字符 FE68 &#xff1a;起始字符AA &#xff1a;仪表类型AA AA AA AA AA AA AA &#xff1a;仪表地址&#xff08;当…

JavaEE进阶---第一个SprintBoot项目创建过程我的感受

文章目录 1.我的创建感受2.环境配置说明2.1xml文件国内源2.2配置流程 3.创建项目4.项目创建说明5.第一个程序--helloworld 1.我的创建感受 今天是学习这个spring boot项目创建的一天&#xff0c;这个确实过程坎坷&#xff0c;于是我自己决定弄一个这个IDEA的 专业版本&#xf…

7.1、实验一:RIPv1配置

一、源文件 7.1、实验一&#xff1a;RIPv1配置: https://url02.ctfile.com/d/61945102-63657205-d343fe?p2707 (访问密码: 2707) 二、实验目的 学会配置RIPv1路由 查看和调试RIPv1路由协议相关信息 三、实验要求 1.拓扑图 2. 四、开始实验 1.配置ip 配置R1 配置R2 配置…

【ARM Linux 系统稳定性分析入门及渐进 1.3 -- Crash工具编译过程】

文章目录 Build Procedure安装二进制 RPM从源代码重建构建过程从 tar 映像构建ARM 平台 Crash 工具安装从源 RPM 构建Build Procedure 从 RHEL3 版本开始,如果在系统安装时选择了开发工具包集(Development Tools),crash 工具会自动安装。然而,对于其他内核版本,或者如果…

【2023工业图像异常检测文献】GRAD: 基于异常生成和重权密集对比模式的异常检测方法

Generating and Reweighting Dense Contrastive Patterns for Unsupervised Anomaly Detection 1、Background 图像异常检测在各个领域扮演着至关重要的角色&#xff0c;包括工业产品缺陷检测、医学图像病变检测、使用X光图像的安全检查以及视频监控。 然而&#xff0c;由于无…

计算机毕业设计Hadoop+Spark大模型微博情感分析 微博舆情分析 微博爬虫 微博可视化 微博大数据分析 微博大数据 大数据毕业设计 Hive数据仓库

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

原型设计软件Axure RP 11 现已发布,更快、更实用的原型设计丨附下载

Axure RP是一套专门为网站或应用程序所设计的快速原型设计工具&#xff0c; 可以让应用网站策划人员或网站功能界面设计师更加快速方便的建立Web AP和Website的线框图、流程图、原型和规格。Axure RP 11&#xff08;下载试用&#xff09; 现已发布&#xff0c;更快、更实用的原…

数据结构-IndexTree结构解析(一)

1.IndexTree IndexTree解决的问题是什么呢&#xff1f;可以从求前缀和入手这个问题。 1.1前缀和数组 简单封装一个前缀和数组&#xff1a; package com.xinghai.arr;import java.util.Arrays;/*** 前缀和数组*/ public class PrefixSumArr {// 存储前缀和数据private int[] p…

外汇EA如何进行历史数据回测?

很多人在下载EA后&#xff0c;直接将其投入实盘交易&#xff0c;而忽略了EA策略的优缺点以及其历史表现。尽管外汇平台提供的历史数据可能不完全准确&#xff0c;但为了确保资金安全和了解EA的真实效果&#xff0c;强烈建议在实盘交易前&#xff0c;先进行充分的历史回测。通过…

聚观早报 | 一加Ace5配置细节曝光;OpenAI重启机器人团队

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 11月7日消息 一加Ace5配置细节曝光 OpenAI重启机器人团队 红魔10 Pro首发搭载悟空屏 华为MatePad 11.5正式发布 …

天融信运维审计系统 download 任意文件读取漏洞复现

0x01 产品描述&#xff1a; 天融信运维审计系统&#xff08;TopSAG&#xff09;是基于自主知识产权的NGTOS安全操作系统平台和多年网络安全防护经验积累研发而成&#xff0c;以4A管理理念为基础、安全代理为核心&#xff0c;提供事前预防、事中监控、事后审计的全方位运维安全解…

centos7安装java

1、首先从官网下载linux的java安装包 2、解压 tar -zxvf jdk-8u231-linux-x64.tar.gz3、修改配置文件 vim /etc/profile添加环境变量 保存后退出 4、刷新配置文件 source /etc/profile

变压吸附制氧设备的型号解析

变压吸附制氧设备(PSA制氧设备)是一种能够在常温常压条件下&#xff0c;利用PSA专用分子筛选择性吸附空气中的氮气、二氧化碳和水等杂质&#xff0c;从而取得纯度较高的氧气(一般为93%2)的设备。关于变压吸附制氧设备的型号&#xff0c;由于市场上存在众多品牌和制造商&#xf…

创新材料科技:铜冷却壁助力高炉节能降耗

高炉用铜冷却壁是高炉内部的一种构件&#xff0c;通常用于高炉的炉身部分。它的主要功能是在高炉冶炼过程中冷却炉壁&#xff0c;以防止炉壁过热。铜冷却壁通常由铜制成&#xff0c;因为铜具有良好的导热性和耐腐蚀性&#xff0c;能够有效地将热量从高炉内部传导到外部&#xf…

【数据集】【YOLO】【目标检测】电动车佩戴头盔检测数据集 5448 张,YOLO/VOC格式标注!

数据集介绍 【数据集】电动车头盔检测数据集 5448 张&#xff0c;目标检测&#xff0c;包含YOLO/VOC格式标注。数据集中包含3种分类&#xff0c;包含两轮电动车、戴头盔、不戴头盔。数据集来自国内外监控摄像头截图。检测范围电动车、摩托车、双轮非自行车。 一、数据概述 佩戴…

VBA11-row和rows的区别

一、row row返回单元格所在的行号&#xff1b; 如果是区域&#xff0c;就返回这个区域的首行的行号。 示例&#xff1a; 二、rows rows代表行的集合&#xff0c;返回range对象。 示例&#xff1a; Sub rowsTest02() 所有的行都会被选中Rows.Select第一行被选中Sheets(1).…

互联网技术人表达力提升:3个珍藏方法,快速见效!

在技术的世界中&#xff0c;逻辑是至高无上的法则&#xff1b;而在现实中&#xff0c;表达力则是成功的关键。 互联网技术人员在与他人沟通时&#xff0c;常常听到被戏称为“说人话”或“听不懂”。这种现象反映出他们在表达中使用了过多的技术术语和专业痕迹&#xff0c;而又缺…