利用python實(shí)現(xiàn)JSON文檔與Python對(duì)象互相轉(zhuǎn)換
前言:
如何將一個(gè)JSON文檔映射為Python對(duì)象主要包括一下三個(gè)部分:
- 考點(diǎn):loads函數(shù)的用法。
- 面試題:如何將一個(gè)JSON文檔映射為Python對(duì)象?
- 解析
一、將一個(gè)JSON文檔映射為Python對(duì)象
第一種方法
供我們讀取的JSON文件是test.json,文件內(nèi)容如下:
{ "name": "孤寒者", "age": 18, "height": 130 }
首先,我們可以通過(guò)json模塊的loads()方法將JSON文檔轉(zhuǎn)為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'])
我們?cè)趌oads()方法里使用對(duì)象鉤子即可實(shí)現(xiàn)將一個(gè)JSON文檔映射為Python對(duì)象。分析思路:
- 我們使用對(duì)象鉤子實(shí)質(zhì)上總共做了兩步:先通過(guò)loads()方法將JSON文檔轉(zhuǎn)換為dict對(duì)象,然后將這個(gè)dict對(duì)象同時(shí)創(chuàng)建Product對(duì)象->將dict對(duì)象作為參數(shù)傳入Product對(duì)象的構(gòu)造方法
__init__()
方法中的第二個(gè)參數(shù),即d。而這個(gè)d其實(shí)就是包含了這個(gè)JSON文檔的字典對(duì)象,我們又在__init__()
方法中將d賦值給了__dict__
(就相當(dāng)于你一個(gè)個(gè)寫類里面的屬性名=屬性值),這就會(huì)將字典里的key和value映射為Product對(duì)象里的屬性和屬性值。
# 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)
第二種方法
也是使用了對(duì)象鉤子,不過(guò)與第一種方法不同的是,此時(shí)對(duì)象鉤子指定的不再是類,而是指定一個(gè)轉(zhuǎn)換函數(shù),通過(guò)這個(gè)函數(shù)返回對(duì)象。
# 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)
小結(jié):
json模塊的loads函數(shù)可以裝載JSON文檔,并將其轉(zhuǎn)換為JSON對(duì)象。關(guān)鍵需要通過(guò)object_hook參數(shù)指定鉤子對(duì)象,然后在類的構(gòu)造方法中將傳入的JSON對(duì)象賦給內(nèi)部變量__init__
。
二、將一個(gè)Python對(duì)象轉(zhuǎn)換為對(duì)應(yīng)的JSON字符串
包括以下三點(diǎn)考點(diǎn):
- dumps函數(shù)的用法。
- 面試題
- 1.面試題一:將一個(gè)Python對(duì)象轉(zhuǎn)換為對(duì)應(yīng)的JSON字符串。
- 2.面試題二:將對(duì)象列表轉(zhuǎn)換為JSON數(shù)組。
- 解析:面試題一 之 將一個(gè)Python對(duì)象轉(zhuǎn)換為對(duì)應(yīng)的JSON字符串:
使用dumps()函數(shù),關(guān)鍵點(diǎn)是使用轉(zhuǎn)換函數(shù)~
# 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參數(shù)指定轉(zhuǎn)換函數(shù)。 jsonStr = json.dumps(product, default=product2Dict, ensure_ascii=False) print(jsonStr) print(type(jsonStr))
面試題二 之 將對(duì)象列表轉(zhuǎn)換為JSON數(shù)組
- 為了實(shí)現(xiàn)這一功能,我們需要一個(gè)對(duì)象列表,所以我們將JSON文檔(如下test.json文件)先轉(zhuǎn)為對(duì)象列表(上一題中我們已經(jīng)知道如何操作了~),然后再給它轉(zhuǎn)為JSON數(shù)組。
[ { "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)
上面截圖可以看出來(lái)我們確實(shí)已經(jīng)將JSON文檔轉(zhuǎn)為對(duì)象列表了~ 下面開(kāi)始解題:
# 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))
總結(jié)
- json模塊的dumps函數(shù)用于將對(duì)象轉(zhuǎn)換為JSON字符串。
- 通過(guò)default參數(shù)指定一個(gè)轉(zhuǎn)換函數(shù),可以在該函數(shù)中提取對(duì)象的屬性值,并生成JSON對(duì)象,最后dumps負(fù)責(zé)將轉(zhuǎn)換函數(shù)返回的JSON對(duì)象轉(zhuǎn)換為JSON字符串。
到此這篇關(guān)于利用python實(shí)現(xiàn)JSON文檔與Python對(duì)象互相轉(zhuǎn)換的文章就介紹到這了,更多相關(guān)JSON映射內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實(shí)現(xiàn)翻譯word表格小程序
這篇文章主要為大家詳細(xì)介紹了python翻譯word表格小程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02python用quad、dblquad實(shí)現(xiàn)一維二維積分的實(shí)例詳解
今天小編大家分享一篇python用quad、dblquad實(shí)現(xiàn)一維二維積分的實(shí)例詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11使用Python實(shí)現(xiàn) 學(xué)生學(xué)籍管理系統(tǒng)
這篇文章主要介紹了使用Python實(shí)現(xiàn) 學(xué)生學(xué)籍管理系統(tǒng),代碼大致分為五個(gè)函數(shù)組成,具體內(nèi)容詳情本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2019-11-1120行Python代碼實(shí)現(xiàn)一款永久免費(fèi)PDF編輯工具的實(shí)現(xiàn)
這篇文章主要介紹了20行Python代碼實(shí)現(xiàn)一款永久免費(fèi)PDF編輯工具的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08Python編程使用PyQt5庫(kù)實(shí)現(xiàn)動(dòng)態(tài)水波進(jìn)度條示例
這篇文章主要介紹了Python編程使用PyQt5庫(kù)實(shí)現(xiàn)動(dòng)態(tài)水波進(jìn)度條的示例代碼解析,有需要的朋友可以借鑒參考下希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2021-10-10關(guān)于你不想知道的所有Python3 unicode特性
我的讀者知道我是一個(gè)喜歡痛罵Python3 unicode的人。這次也不例外。我將會(huì)告訴你用unicode有多痛苦和為什么我不能閉嘴。我花了兩周時(shí)間研究Python3,我需要發(fā)泄我的失望。在這些責(zé)罵中,仍然有有用的信息,因?yàn)樗涛覀內(nèi)绾蝸?lái)處理Python3。如果沒(méi)有被我煩到,就讀一讀吧2014-11-11Python網(wǎng)絡(luò)通訊之TCP協(xié)議實(shí)現(xiàn)服務(wù)器和客戶端實(shí)例
這篇文章主要介紹了Python網(wǎng)絡(luò)通訊之TCP協(xié)議實(shí)現(xiàn)服務(wù)器和客戶端實(shí)例, socket編程一種獨(dú)立于協(xié)議的網(wǎng)絡(luò)編程接口,應(yīng)用程序可以通過(guò)它發(fā)送或接收數(shù)據(jù),可對(duì)其進(jìn)行像對(duì)文件一樣的打開(kāi)、讀寫和關(guān)閉等操作,需要的朋友可以參考下2023-08-08Python 非極大值抑制(NMS)的四種實(shí)現(xiàn)詳解
本文主要介紹了非極大值抑制(Non-Maximum Suppression,NMS)的四種實(shí)現(xiàn)方式,不同方法對(duì)NMS速度的影響各不相同,感興趣的小伙伴可以了解一下2021-11-11