博主在开发一些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)
运行结果:
{'name': 'admin', 'age': 20, 'children': {'name': 'child1', 'age': 1}}
数组对象
代码示例:
user_list = json.loads('[1,2,3,4]') print(type(user_list)) print(user_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" }
运行结果:
{'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)
结果:
{"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)
结果:
{"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)
结果:
{
"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
到此这篇关于Python 中的json常见用法的文章就介绍到这了,更多相关python json用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!