Python 中的json常见用法实例详解
作者:小楼夜听雨QAQ 发布时间:2022-01-03 15:28:48
博主在开发一些C端小软件时,喜欢用json作为序列化方案,故总结下python中json库常见用法。
导包
自带的库,无需额外安装。
import json
api介绍
序列化:
这里可以理解为将python中的各种数据结构转化为json字符串的过程。
涉及api:dump、dumps
反序列化:
将输入的json字符串,转化为python对象的过程。
涉及api:load、loads
加s和不加s的区别:
以反序列化为例,如果需要从文件中读取数据,则使用load,直接传入文件描述符。
简而言之,就是需要从文件中读写数据时,使用load、dump,否则使用loads、dumps
常见用法
json转python内置对象
json会被适当地转化为python中的list或者dic类型的对象。
字典对象
代码示例:
user_dic = json.loads('{"name": "admin", "age": 20, "children": {"name": "child1", "age": 1}}')
print(type(user_dic))
print(user_dic)
运行结果:
<class 'dict'>
{'name': 'admin', 'age': 20, 'children': {'name': 'child1', 'age': 1}}
数组对象
代码示例:
user_list = json.loads('[1,2,3,4]')
print(type(user_list))
print(user_list)
运行结果:
<class 'list'>
[1, 2, 3, 4]
文件读取
代码示例:
with open('out.json', mode='r', encoding='utf-8') as fp:
user_dic = json.load(fp=fp)
print(type(user_dic))
print(user_dic)
文件中存储的json
{
"age": 20,
"children": {
"age": 1,
"name": "child1"
},
"name": "admin"
}
运行结果:
<class 'dict'>
{'age': 20, 'children': {'age': 1, 'name': 'child1'}, 'name': 'admin'}
python内置对象转json
字典转json
json_str = json.dumps({'name': 'admin', 'age': 20, 'children': {'name': 'child1', 'age': 1}})
print(type(json_str))
print(json_str)
结果:
<class 'str'>
{"name": "admin", "age": 20, "children": {"name": "child1", "age": 1}}
字典转json(压缩存储)
如果存储后的数据并不用于人工阅读,可以考虑去除所有地空格和换行。
json_str = json.dumps({'name': 'admin', 'age': 20, 'children': {'name': 'child1', 'age': 1}}, separators=(',', ':'))
print(type(json_str))
print(json_str)
结果:
<class 'str'>
{"name":"admin","age":20,"children":{"name":"child1","age":1}}
字典转json(美化输出)
适用于对外展示,提高可读性;这里的indent=4表示缩进空格数。
json_str = json.dumps({'name': 'admin', 'age': 20, 'children': {'name': 'child1', 'age': 1}}, sort_keys=True, indent=4)
print(type(json_str))
print(json_str)
结果:
<class 'str'>
{
"age": 20,
"children": {
"age": 1,
"name": "child1"
},
"name": "admin"
}
文件读取
with open('out.json', mode='w+', encoding='utf-8') as fp:
json.dump(fp=fp, obj={'name': 'admin', 'age': 20, 'children': {'name': 'child1', 'age': 1}}, sort_keys=True, indent=4)
自定义对象
如果是自定义的对象,需要先将对象转化为字典类型,再使用json库相关的api。
普通对象
class Child:
def __init__(self, name):
self.name = name
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
单个对象
# 序列化对象
s_str = json.dumps(Student('admin', 18).__dict__)
print(s_str)
# 反序列化对象
student_obj = Student(**json.loads(s_str))
print(student_obj)
数组对象
# 序列化数组
s_list = [Student('admin1', 1), Student('admin2', 2)]
s_str = json.dumps([obj.__dict__ for obj in s_list])
print(s_str)
# 反序列化数组
student_list = []
for st in json.loads(s_str):
student_list.append(Student(**st))
print(student_list)
嵌套对象
出现嵌套对象时,思路也是一样的,都优先转化为字典。
class Child:
def __init__(self, name):
self.name = name
def __str__(self):
return "{0}".format(self.name)
class Student:
def __init__(self, name, age, children: Child):
self.name = name
self.age = age
self.children = children
def __str__(self):
return "{0}, {1}, children:{2}".format(self.name, self.age, self.children)
单个对象
# 序列化
s_str = json.dumps(Student('admin', 18, Child('son')), default=lambda o: o.__dict__, indent=4)
print(s_str)
# 反序列化
decode_s = Student(**json.loads(s_str))
print(decode_s)
对象数组
# 序列化
s_list = [Student('admin1', 1, Child('son1')), Student('admin2', 2, Child('son2'))]
s_str = json.dumps([obj.__dict__ for obj in s_list], default=lambda o: o.__dict__, indent=4)
print(s_str)
# 反序列化最外层套了一个list,其他与单个对象一致。
补充知识点
上述示例中出现的 ** 是一种传参方式,接收字典类型的数据。
def func(**kwargs):
print(kwargs['a'])
print(kwargs['b'])
print(type(kwargs))
s_dic = {'a': 1, "b": 2}
func(**s_dic)
输出结果为
1
2
<class 'dict'>
来源:https://blog.csdn.net/qq_37855749/article/details/128430942
![](https://www.aspxhome.com/images/zang.png)
![](https://www.aspxhome.com/images/jiucuo.png)
猜你喜欢
- 我就废话不多说了,直接 上代码吧!import kafka.api.PartitionOffsetRequestInfo;import ka
- 需要ping一个网段所有机器的在线情况,shell脚步运行时间太长,用python写个多线程ping吧,代码如下:#!/usr/bin/py
- 本文实例为大家分享了python实现knn算法的具体代码,供大家参考,具体内容如下knn算法描述对需要分类的点依次执行以下操作:1.计算已知
- 本文为大家分享了pygame游戏之旅的第12篇,供大家参考,具体内容如下实现点击功能:click = pygame.mouse.get_pr
- 当需要存储很多同类型的不通过数据时可能需要使用到嵌套,先用一个例子说明嵌套的使用1、在列表中存储字典#假设年级里有一群国际化的学生,有黄皮肤
- Python是一个非常实用、流行的解释型编程语言,其优势之一就是可以借助其交互的shell进行探索式地编程。你可以试着输入一些代码,然后马上
- 最近遇到SQL Server 2005 输入框不能输入中文,在网上查了N久,试验了十几次奏这个法子有用:“把你表中的自动编号列放到最后面”。
- 显示图像是 Opencv最基本的操作之一, imshow()函数可以实现该操作。如果使用过其他GUI框架背景,就会很自然地调用 imshow
- 介绍我们可以通过for循环来迭代list、tuple、dict、set、字符串,dict比较特殊dict的存储不是连续的,所以迭代(遍历)出
- 语言的内存管理是语言设计的一个重要方面。它是决定语言性能的重要因素。无论是C语言的手工管理,还是Java的垃圾回收,都成为语言最重要的特征。
- 前言本文主要给大家介绍了关于python计算时间差(返回天数)的相关资料,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧方法
- 引言近期网上这位卖蜂蜜的小伙鬼畜挺火的,大家质疑背景造假,这里我就带着大家实现“背景造假”(PS:原
- 客户用的数据库是mysql,而研发好的产品支持oracle,为了让客户掏腰包,我们必须把数据库环境从oracle转向mysql。我们在转换的
- 说明1. 使用google翻译服务获得翻译和语音;2. 使用mplayer播放获得的声音文件,因此,如果要播放语音,请确保PATH中能够找到
- identity-card验证身份证号码的正确性,不能仅仅通过正则表达式来验证,我们都知道我国的身份证一共是18位,由十七位数字本体码和一位
- 根据Nicholas的说法,有四种代码会拖慢脚本的运行,并最终导致脚本失控。分别是次数过多的同步循环、庞大的函数体、不恰当的递归和不合理的D
- CSS Sprites 简介:通常被意译为“CSS图像拼合”或“CSS贴图定位”。CSS Sprites并不是一门新技术,目前它已经在网页开
- 在目标检测中一个很重要的问题就是NMS及IOU计算,而一般所说的目标检测检测的box是规则矩形框,计算IOU也非常简单,有两种方法:1. 两
- 目录前言 字符串都有哪些操作?第一类 判断识别字符串第二类 字符串编辑的操作第三类:字符串跟字节串的互转总结前言今天我们说了字符串
- 1.算法:设有一组关键字{ K 1 , K 2 ,…, K n };排序开始就认为 K 1 是一个有序序列;让 K 2 插入上述表长为 1