【测试语言篇四】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.rhkb.cn/news/466460.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Twitter(X)2024最新注册教程

Twitter 现名为X&#xff0c;因为图标是一只小鸟的形象&#xff0c;大家也叫它小蓝鸟&#xff08;埃隆马斯克于 2023 年对该平台进行了品牌重塑&#xff09;&#xff0c;目前仍然是全球最受欢迎的社交媒体和微博平台之一&#xff0c;全球活跃用户量大概在4.5亿。尤其是欧美国家…

[单例模式]

[设计模式] 设计模式是软件工程中的一种常见做法, 它可以理解为"模板", 是针对一些常见的特定场景, 给出的一些比较好的固定的解决方案. 不同语言适用的设计模式是不一样的. 这里我们接下来要谈到的是java中典型的设计模式. 而且由于设计模式比较适合有一定编程经…

[mysql]DDL,DML综合案例,

综合案例 题目如下 目录 综合案例 ​编辑 ​编辑 # 1、创#1建数据库test01_library # 2、创建表 books&#xff0c;表结构如下&#xff1a; # 3、向books表中插入记录库存 # 4、将小说类型(novel)的书的价格都增加5。 # 5、将名称为EmmaT的书的价格改为40&#xff0c;并将…

day-81 打家劫舍 II

思路 与LCR 089. 打家劫舍相比&#xff0c;本题所有房屋围成了一圈&#xff0c;那么第一间房子和最后一间房子不能同时打劫&#xff0c;那么就可以分为两种情况&#xff1a;1.选第一间房打劫&#xff1b;2.选最后一间房打劫 解题过程 然后依次计算出以上两种情况的最大金额&am…

秃姐学AI系列之:GRU——门控循环单元 | LSTM——长短期记忆网络

RNN存在的问题 因为RNN模型的BPTT反向传导的链式求导&#xff0c;导致需要反复乘以一个也就是说会出现指数级别的问题&#xff1a; 梯度爆炸&#xff1a;如果的话&#xff0c;那么连乘的结果可能会快速增长&#xff0c;导致梯度爆炸梯度消失&#xff1a;如果的话&#xff0c;…

OpenHarmony 入门——ArkUI 自定义组件间的父子双向同步状态装饰器@Link语法(四)

文章大纲 引言一、组件间状态装饰器Link 父子双向同步1、使用规则2、支持的观察变化的场景和ArkUI 刷新UI3、Link变量值初始化和更新机制3.1、初始渲染&#xff1a;执行父组件的build()函数后将创建子组件的新实例。3.2、Link的数据源的更新&#xff1a;即父组件中状态变量更新…

机器学习与数据挖掘_使用梯度下降法训练线性回归模型

目录 实验内容 实验步骤 1. 导入必要的库 2. 加载数据并绘制散点图 3. 设置模型的超参数 4. 实现梯度下降算法 5. 打印训练后的参数和损失值 6. 绘制损失函数随迭代次数的变化图 7. 绘制线性回归拟合曲线 8. 基于训练好的模型进行新样本预测 实验代码 实验结果 实验…

机器学习与AI|如何利用数据科学优化库存周转率?

对于所有零售商来说&#xff0c;良好的库存管理都是非常重要的。众所周知&#xff0c;商品如果不放在货架上就无法出售&#xff0c;而如果库存过多则意味着严重的财务负担。 但是做好库存管理绝非易事&#xff0c;它依赖于对未来需求的准确预测和确保始终有合适库存的敏捷供应链…

Proteus中数码管动态扫描显示不全(已解决)

文章目录 前言解决方法后记 前言 我是直接把以前写的 51 数码管程序复制过来的&#xff0c;当时看的郭天祥的视频&#xff0c;先送段选&#xff0c;消隐后送位选&#xff0c;最后来个 1ms 的延时。 代码在 Proteus 中数码管静态是可以的&#xff0c;动态显示出了问题——显示…

如何快速搭建一个spring boot项目

一、准备工作 1.1 安装JDK&#xff1a;确保计算机上已安装Java Development Kit (JDK) 8或更高版本、并配置了环境变量 1.2 安装Maven&#xff1a;下载并安装Maven构建工具&#xff0c;这是Spring Boot官方推荐的构建工具。 1.3 安装代码编辑器&#xff1a;这里推荐使用Inte…

基于ViT的无监督工业异常检测模型汇总

基于ViT的无监督工业异常检测模型汇总 论文1&#xff1a;RealNet: A Feature Selection Network with Realistic Synthetic Anomaly for Anomaly Detection&#xff08;2024&#xff09;1.1 主要思想1.2 系统框架 论文2&#xff1a;Inpainting Transformer for Anomaly Detecti…

数据结构C语言描述2(图文结合)--有头单链表,无头单链表(两种方法),链表反转、有序链表构建、排序等操作,考研可看

前言 这个专栏将会用纯C实现常用的数据结构和简单的算法&#xff1b;用C基础即可跟着学习&#xff0c;代码均可运行&#xff1b;准备考研的也可跟着写&#xff0c;个人感觉&#xff0c;如果时间充裕&#xff0c;手写一遍比看书、刷题管用很多&#xff0c;这也是本人采用纯C语言…

Python | Leetcode Python题解之第542题01矩阵

题目&#xff1a; 题解&#xff1a; class Solution:def updateMatrix(self, matrix: List[List[int]]) -> List[List[int]]:m, n len(matrix), len(matrix[0])# 初始化动态规划的数组&#xff0c;所有的距离值都设置为一个很大的数dist [[10**9] * n for _ in range(m)]…

ENSP作业——园区网

题目 根据上图&#xff0c;可得需求为&#xff1a; 1.配置交换机上的VLAN及IP地址。 2.设置SW1为VLAN 2/3的主根桥&#xff0c;设置SW2为VLAN 20/30的主根桥&#xff0c;且两台交换机互为主备。 3.可以使用super vlan。 4.上层通过静态路由协议完成数据通信过程。 5.AR1作为企…

【1个月速成Java】基于Android平台开发个人记账app学习日记——第7天,申请阿里云SMS短信服务SDK

系列专栏链接如下&#xff0c;方便跟进&#xff1a; https://blog.csdn.net/weixin_62588253/category_12821860.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12821860&sharereferPC&sharesourceweixin_62588253&sharefromfrom_link 同时篇幅…

让Apache正确处理不同编码的文件避免中文乱码

安装了apache2.4.39以后&#xff0c;默认编码是UTF-8&#xff0c;不管你文件是什么编码&#xff0c;统统按这个来解析&#xff0c;因此 GB2312编码文件内的中文将显示为乱码。 <!doctype html> <html> <head><meta http-equiv"Content-Type" c…

『Django』初识前后端分离

点赞 + 关注 + 收藏 = 学会了 本文简介 在前面的「Django」系列的文章 中使用的是“前后端不分离”的方式去学习 Django,但现在企业比较流行的开发方式是前后端分离。 简单来说,前后端分离就是把前端和后端的工作分配给2个人做,前端主要负责用户界面的开发,后端主要负责…

探索开放资源上指令微调语言模型的现状

人工智能咨询培训老师叶梓 转载标明出处 开放模型在经过适当的指令调整后&#xff0c;性能可以与最先进的专有模型相媲美。但目前缺乏全面的评估&#xff0c;使得跨模型比较变得困难。来自Allen Institute for AI和华盛顿大学的研究人员们进行了一项全面的研究&#xff0c;探索…

搜维尔科技:【应用】Xsens在荷兰车辆管理局人体工程学评估中的应用

荷兰车辆管理局&#xff08;RDW&#xff09;通过数据驱动的人体工程学评估&#xff0c;将职业健康和安全放在首位。 关键信息 01 改进人体工程学评估&#xff1a;RDW使用Xsens动作捕捉和Scalefit Industrial Athlete进行精确、实时的人体工程学评估&#xff0c;识别并降低与…

文件系统和日志管理 附实验:远程访问第一台虚拟机日志

文件系统和日志管理 文件系统&#xff1a;文件系统提供了一个接口&#xff0c;用户用来访问硬件设备&#xff08;硬盘&#xff09;。 硬件设备上对文件的管理 文件存储在硬盘上&#xff0c;硬盘最小的存储单位是512字节&#xff0c;扇区。 文件在硬盘上的最小存储单位&…