Python?中的json常見(jiàn)用法實(shí)例詳解
博主在開發(fā)一些C端小軟件時(shí),喜歡用json作為序列化方案,故總結(jié)下python中json庫(kù)常見(jiàn)用法。
導(dǎo)包
自帶的庫(kù),無(wú)需額外安裝。
import json
api介紹
序列化:
這里可以理解為將python中的各種數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)化為json字符串的過(guò)程。
涉及api:dump、dumps
反序列化:
將輸入的json字符串,轉(zhuǎn)化為python對(duì)象的過(guò)程。
涉及api:load、loads
加s和不加s的區(qū)別:
以反序列化為例,如果需要從文件中讀取數(shù)據(jù),則使用load,直接傳入文件描述符。
簡(jiǎn)而言之,就是需要從文件中讀寫數(shù)據(jù)時(shí),使用load、dump,否則使用loads、dumps
常見(jiàn)用法
json轉(zhuǎn)python內(nèi)置對(duì)象
json會(huì)被適當(dāng)?shù)剞D(zhuǎn)化為python中的list或者dic類型的對(duì)象。
字典對(duì)象
代碼示例:
user_dic = json.loads('{"name": "admin", "age": 20, "children": {"name": "child1", "age": 1}}') print(type(user_dic)) print(user_dic)
運(yùn)行結(jié)果:
<class 'dict'>
{'name': 'admin', 'age': 20, 'children': {'name': 'child1', 'age': 1}}
數(shù)組對(duì)象
代碼示例:
user_list = json.loads('[1,2,3,4]') print(type(user_list)) print(user_list)
運(yùn)行結(jié)果:
<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)
文件中存儲(chǔ)的json
{ "age": 20, "children": { "age": 1, "name": "child1" }, "name": "admin" }
運(yùn)行結(jié)果:
<class 'dict'>
{'age': 20, 'children': {'age': 1, 'name': 'child1'}, 'name': 'admin'}
python內(nèi)置對(duì)象轉(zhuǎn)json
字典轉(zhuǎn)json
json_str = json.dumps({'name': 'admin', 'age': 20, 'children': {'name': 'child1', 'age': 1}}) print(type(json_str)) print(json_str)
結(jié)果:
<class 'str'>
{"name": "admin", "age": 20, "children": {"name": "child1", "age": 1}}
字典轉(zhuǎn)json(壓縮存儲(chǔ))
如果存儲(chǔ)后的數(shù)據(jù)并不用于人工閱讀,可以考慮去除所有地空格和換行。
json_str = json.dumps({'name': 'admin', 'age': 20, 'children': {'name': 'child1', 'age': 1}}, separators=(',', ':')) print(type(json_str)) print(json_str)
結(jié)果:
<class 'str'>
{"name":"admin","age":20,"children":{"name":"child1","age":1}}
字典轉(zhuǎn)json(美化輸出)
適用于對(duì)外展示,提高可讀性;這里的indent=4表示縮進(jìn)空格數(shù)。
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)
結(jié)果:
<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)
自定義對(duì)象
如果是自定義的對(duì)象,需要先將對(duì)象轉(zhuǎn)化為字典類型,再使用json庫(kù)相關(guān)的api。
普通對(duì)象
class Child: def __init__(self, name): self.name = name class Student: def __init__(self, name, age): self.name = name self.age = age
單個(gè)對(duì)象
# 序列化對(duì)象 s_str = json.dumps(Student('admin', 18).__dict__) print(s_str) # 反序列化對(duì)象 student_obj = Student(**json.loads(s_str)) print(student_obj)
數(shù)組對(duì)象
# 序列化數(shù)組 s_list = [Student('admin1', 1), Student('admin2', 2)] s_str = json.dumps([obj.__dict__ for obj in s_list]) print(s_str) # 反序列化數(shù)組 student_list = [] for st in json.loads(s_str): student_list.append(Student(**st)) print(student_list)
嵌套對(duì)象
出現(xiàn)嵌套對(duì)象時(shí),思路也是一樣的,都優(yōu)先轉(zhuǎn)化為字典。
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)
單個(gè)對(duì)象
# 序列化 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)
對(duì)象數(shù)組
# 序列化 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) # 反序列化最外層套了一個(gè)list,其他與單個(gè)對(duì)象一致。
補(bǔ)充知識(shí)點(diǎn)
上述示例中出現(xiàn)的 ** 是一種傳參方式,接收字典類型的數(shù)據(jù)。
def func(**kwargs): print(kwargs['a']) print(kwargs['b']) print(type(kwargs)) s_dic = {'a': 1, "b": 2} func(**s_dic)
輸出結(jié)果為
1
2
<class 'dict'>
到此這篇關(guān)于Python 中的json常見(jiàn)用法的文章就介紹到這了,更多相關(guān)python json用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- python中的Json模塊dumps、dump、loads、load函數(shù)用法詳解
- python中json.dumps()和json.loads()的用法
- python中json操作之json.loads、json.load、json.jumps及json.jump用法
- python標(biāo)準(zhǔn)庫(kù)模塊之json庫(kù)的基礎(chǔ)用法
- Python中最好用的json庫(kù)orjson用法詳解
- Python Http請(qǐng)求json解析庫(kù)用法解析
- python的json包位置及用法總結(jié)
- python的json中方法及jsonpath模塊用法分析
相關(guān)文章
解決pip安裝tensorflow中出現(xiàn)的no module named tensorflow.python 問(wèn)題方法
這篇文章主要介紹了解決pip安裝tensorflow中出現(xiàn)的no module named tensorflow.python 問(wèn)題方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02Python語(yǔ)言實(shí)現(xiàn)科學(xué)計(jì)算器
這篇文章主要為大家詳細(xì)介紹了Python語(yǔ)言實(shí)現(xiàn)科學(xué)計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01人臉識(shí)別實(shí)戰(zhàn)之Opencv+SVM實(shí)現(xiàn)人臉識(shí)別
這篇文章主要介紹了通過(guò)Opencv+SVM實(shí)現(xiàn)人臉識(shí)別功能,文中的示例代碼介紹詳細(xì),對(duì)于我們學(xué)習(xí)人臉識(shí)別和OpenCV都有一定的幫助,感興趣的小伙伴可以學(xué)習(xí)一下2021-12-12python+selenium 定位到元素,無(wú)法點(diǎn)擊的解決方法
今天小編就為大家分享一篇python+selenium 定位到元素,無(wú)法點(diǎn)擊的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01Python編程實(shí)戰(zhàn)之Oracle數(shù)據(jù)庫(kù)操作示例
這篇文章主要介紹了Python編程實(shí)戰(zhàn)之Oracle數(shù)據(jù)庫(kù)操作,結(jié)合具體實(shí)例形式分析了Python的Oracle數(shù)據(jù)庫(kù)模塊cx_Oracle包安裝、Oracle連接及操作技巧,需要的朋友可以參考下2017-06-06TensorFlow固化模型的實(shí)現(xiàn)操作
這篇文章主要介紹了TensorFlow固化模型的實(shí)現(xiàn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05Python接口自動(dòng)化淺析數(shù)據(jù)驅(qū)動(dòng)原理
這篇文章主要介紹了Python接口自動(dòng)化淺析數(shù)據(jù)驅(qū)動(dòng)原理,文中會(huì)詳細(xì)描述怎樣使用openpyxl模塊操作excel及結(jié)合ddt來(lái)實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng),有需要的朋友可以參考下2021-08-08