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