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


猜你喜欢
- 前期准备首先,使用Python内置的Turtle绘图库需要在程序前添加以下代码:import turtle也可以写成这样:from turt
- logging模块介绍Python的logging模块提供了通用的日志系统,熟练使用logging模块可以方便开发者开发第三方模块或者是自己
- Bootstrap简介Bootstrap,来自 Twitter,是目前最受欢迎的前端框架。Bootstrap 是基于 HTML、CSS、JA
- 在学习django的时候,想要实现登录失败后,进行用户锁定,切记录锁定时间,在网上找了很多资料,但是都感觉不是那么靠谱,于是乎,我开始了我的
- 实例如下:/** * 将数值四舍五入后格式化. * * @pa
- 最近在自己写页面,模仿思否论坛,然后写登录注册UI的时候需要一个验证码组件. 去搜一下没找到什么合适的,而且大多都是基于后端的,于是自己手写
- 效果图实现代码vue2 代码如下<!-- 横向柱状图测试结果 --><template> <div
- 一共4个页面:form.asp; chk.asp; num.asp; count.asp得到一个随即数字。加密
- 同步的方法基本与多线程相同。1) Lock当多个进程需要访问共享资源的时候,Lock可以用来避免访问的冲突。import multiproc
- 本文实例讲述了Python图像处理之颜色的定义与使用。分享给大家供大家参考,具体如下:python中的颜色相关的定义在matplotlib模
- 最近想实现PHP实现短信验证的效果,做PC网站的时候,可以通过注册用户需要使用短信验证的功能,或者找回密码,以及验证用户的信息等等功能,发现
- 前言:自增列可使用 auto_increment 来实现,当一个列被标识为 auto_increment 之后,在添加时如果不给此列设置任何
- 前言本文主要给大家介绍关于Django中STATIC_ROOT和STATIC_URL及STATICFILES_DIRS的相关内容,分享出来供
- 本文实例讲述了Python实现批量修改文件名的方法。分享给大家供大家参考。具体如下:下载了评书《贺龙传奇》,文件名中却都含有xxx有声下载,
- 线程池的理想大小取决于被提交任务的类型以及所部署系统的特性。线程池应该避免设置的过大或过小,如果线程池过大,大量的线程将在相对很少的CPU和
- MySQL Workbench - 建模和设计工具1.模型是大多数有效和高性能数据库的核心。MySQL workbench具有允许开发人员和
- 在SQL查询中,关键词Like可提供模糊查询功能,它通常与通配符一起使用。1 Like条件适用数据库字段类型 &nbs
- 本文实例为大家分享了vue实现验证码倒计时按钮的具体代码,供大家参考,具体内容如下1、点击“发送验证码”按钮后进行逻辑判断:▶️ 如果邮箱已
- “你如何为成千上万的用户和页面提供CSS?” 这是Nicole Sullivan在她的在丹佛的Web Directions North 大会
- 一、什么是ttkbootstrap?官方文档 [较慢]:https://ttkbootstrap.readthedocs.io/en/lat