利用python实现JSON文档与Python对象互相转换
作者:??孤寒者???? 发布时间:2023-01-02 01:30:46
前言:
如何将一个JSON文档映射为Python对象主要包括一下三个部分:
考点:loads函数的用法。
面试题:如何将一个JSON文档映射为Python对象?
解析
一、将一个JSON文档映射为Python对象
第一种方法
供我们读取的JSON文件是test.json,文件内容如下:
{
"name": "孤寒者",
"age": 18,
"height": 130
}
首先,我们可以通过json模块的loads()方法将JSON文档转为Python字典类型:
# coding=utf-8
import json
with open('test.json', 'r', encoding='utf-8') as f:
jsonStr = f.read()
product = json.loads(jsonStr)
print(type(product))
print(product['name'])
我们在loads()方法里使用对象钩子即可实现将一个JSON文档映射为Python对象。分析思路:
我们使用对象钩子实质上总共做了两步:先通过loads()方法将JSON文档转换为dict对象,然后将这个dict对象同时创建Product对象->将dict对象作为参数传入Product对象的构造方法
__init__()
方法中的第二个参数,即d。而这个d其实就是包含了这个JSON文档的字典对象,我们又在__init__()
方法中将d赋值给了__dict__
(就相当于你一个个写类里面的属性名=属性值),这就会将字典里的key和value映射为Product对象里的属性和属性值。
# coding=utf-8
import json
class Product:
def __init__(self, d):
self.__dict__ = d
with open('test.json', 'r', encoding='utf-8') as f:
jsonStr = f.read()
product = json.loads(jsonStr, object_hook=Product)
print(type(product))
# print(product['name']) # 这样就不行了~
print(product.name)
第二种方法
也是使用了对象钩子,不过与第一种方法不同的是,此时对象钩子指定的不再是类,而是指定一个转换函数,通过这个函数返回对象。
# coding=utf-8
import json
class Product:
def __init__(self, d):
self.__dict__ = d
with open('test.json', 'r', encoding='utf-8') as f:
jsonStr = f.read()
def json2Product(d):
return Product(d)
product1 = json.loads(jsonStr, object_hook=json2Product)
print(type(product1))
print(product1.name)
小结:
json模块的loads函数可以装载JSON文档,并将其转换为JSON对象。关键需要通过object_hook参数指定钩子对象,然后在类的构造方法中将传入的JSON对象赋给内部变量__init__
。
二、将一个Python对象转换为对应的JSON字符串
包括以下三点考点:
dumps函数的用法。
面试题
1.面试题一:将一个Python对象转换为对应的JSON字符串。
2.面试题二:将对象列表转换为JSON数组。
解析:面试题一 之 将一个Python对象转换为对应的JSON字符串:
使用dumps()函数,关键点是使用转换函数~
# coding=utf-8
import json
class Product:
def __init__(self, name, age, height):
self.name = name
self.age = age
self.height = height
product = Product('孤寒者', 18, 130)
def product2Dict(obj):
return {
'name': obj.name,
'age': obj.age,
'height': obj.height
}
# dumps()方法的default参数指定转换函数。
jsonStr = json.dumps(product, default=product2Dict, ensure_ascii=False)
print(jsonStr)
print(type(jsonStr))
面试题二 之 将对象列表转换为JSON数组
为了实现这一功能,我们需要一个对象列表,所以我们将JSON文档(如下test.json文件)先转为对象列表(上一题中我们已经知道如何操作了~),然后再给它转为JSON数组。
[
{
"name": "孤寒者",
"age": 18,
"height": 130
},
{
"name": "小张",
"age": 18,
"height": 80
}
]
# coding=utf-8
import json
class Product:
def __init__(self, d):
self.__dict__ = d
with open('test.json', 'r', encoding='utf-8') as f:
jsonStr = f.read()
products = json.loads(jsonStr, object_hook=Product)
print(products)
上面截图可以看出来我们确实已经将JSON文档转为对象列表了~ 下面开始解题:
# coding=utf-8
import json
class Product:
def __init__(self, d):
self.__dict__ = d
with open('test.json', 'r', encoding='utf-8') as f:
jsonStr = f.read()
products = json.loads(jsonStr, object_hook=Product)
print(products)
for product in products:
print(product.name)
print("*"*25)
# 解题部分:
def product2Dict(obj):
return {
'name': obj.name,
'age': obj.age,
'height': obj.height
}
jsonStr = json.dumps(products, default=product2Dict, ensure_ascii=False)
print(jsonStr)
print(type(jsonStr))
总结
json模块的dumps函数用于将对象转换为JSON字符串。
通过default参数指定一个转换函数,可以在该函数中提取对象的属性值,并生成JSON对象,最后dumps负责将转换函数返回的JSON对象转换为JSON字符串。
来源:https://juejin.cn/post/7066062062295711751


猜你喜欢
- 今天以一个表单的自动提交,来进一步学习selenium的用法练习目标0)运用selenium启动firefox并载入指定页面(这部分可查看本
- 测试环境win10python 3.5yield功能简介简单来说,yield 的作用就是把一个函数变成一个 generator,带有 yie
- mysql在查询上千万级数据的时候,通过索引可以解决大部分查询优化问题。但是在处理上亿数据的时候,索引就不那么友好了。数据表(日志)是这样的
- 我们在学习Python的时候,除了用pip安装一些模块之外,有时候会从网站下载安装包下来安装,我也想要把我自己编写的模块做成这样的安装包,该
- 项目中遇到图片实际显示尺寸的判定问题,图片可能被缩放过,所以实际显示的宽高无法通过常见的各种width,height拿到(都是得到图像的自然
- 项目场景:Python项目需要画两组数据的双柱状图,以下以一周七天两位小朋友吃糖颗数为例进行演示,用matplotlib库实现代码:impo
- 我们使用alter table add column语句向现有表中添加新列。简介alter table table_nameadd [col
- 零、配置Tomcat默认情况下Tomcat是没有配置用户角色权限的但是,后续Jenkins部署项目到Tomcat服务器,需要用到Tomcat
- 第一种: <script language="javascript" type="text/javasc
- 前言网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或
- 关于 Python requests ,在使用中,总结了一些小技巧把,记录下。1:保持请求之间的Cookies,我们可以这样做。
- __new__: 对象的创建,是一个静态方法,第一个参数是cls。(想想也是,不可能是self,对象还没创建,哪来的self)__init_
- 前言第一次处理视频素材可以手动用剪映来处理,然后再用代码进行自动化处理,不然连朝哪个方向自动化处理可能都不知道那清楚处理流程之后,怎么用Py
- 关于CIFAR10数据集的使用主要解决了如何把数据集与transforms结合在一起的问题。CIFAR10的官方解释torchvision.
- LSMT层可以在troch.nn模块中找到LSTM类lstm = torch.nn.LSTM(*paramsters)1、__init__方
- css+div做的菜单:一个主显示层,别的列表都隐藏着,用js函数设置列表的显示和隐藏。分别用到了两个函数,函数实现的效果是一样的,一个是参
- 口罩佩戴检测一 题目背景1.1 实验介绍今年一场席卷全球的新型冠状病毒给人们带来了沉重的生命财产的损失。有效防御这种传染病毒的方法就是积极佩
- 前言:把一个功能模块使用组件化的思想充分封装,如导航栏,这无论对我们的开发思想还是效率都有许多好处,在开发中,我们要尽量多得运用组件化的开发
- 前言最近在数据库的一张表添加两个字段,后来提示什么磁盘空间不足什么什么的,后来数据库就断开连接了,之后就一直连接不上去后来,最后经过思考终于
- 目的将一些小的字符串合并成一个大字符串,更多考虑的是性能方法 常见的方法有以下几种:1.使用+=操作符BigString=smal