深入理解Python對(duì)Json的解析
Json簡(jiǎn)介
JSON(JavaScript Object Notation) 是一種輕量級(jí)的數(shù)據(jù)交換格式。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一個(gè)子集。 JSON采用完全獨(dú)立于語(yǔ)言的文本格式,但是也使用了類(lèi)似于C語(yǔ)言家族的習(xí)慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。這些特性使JSON成為理想的數(shù)據(jù)交換語(yǔ)言。易于人閱讀和編寫(xiě),同時(shí)也易于機(jī)器解析和生成。
它的格式一般是這樣的:
對(duì)象是一個(gè)無(wú)序的“‘名稱(chēng)/值'對(duì)”集合。一個(gè)對(duì)象以“{”(左括號(hào))開(kāi)始,“}”(右括號(hào))結(jié)束。每個(gè)“名稱(chēng)”后跟一個(gè)“:”(冒號(hào));“‘名稱(chēng)/值' 對(duì)”之間使用“,”(逗號(hào))分隔。
例如下面這樣:
{"b": "Hello", "c": null, "a": true}
它的值可以是雙引號(hào)括起來(lái)的字符串(string)、數(shù)值(number)、true、false、 null、對(duì)象(object)或者數(shù)組(array)。這些結(jié)構(gòu)可以嵌套。

值(value)可以是雙引號(hào)括起來(lái)的字符串(string)、數(shù)值(number)、true、false、 null、對(duì)象(object)或者數(shù)組(array)。這些結(jié)構(gòu)可以嵌套。
使用Python編碼和解析Json
Python內(nèi)置了json包來(lái)幫助我們完成對(duì)json的操作。
將Python的字典結(jié)構(gòu)導(dǎo)出到j(luò)son使用json.dumps() ,將json讀成Python的字典結(jié)構(gòu),使用json.loads() 。
如果不是針對(duì)string操作而是對(duì)文件操作,分別使用json.load()函數(shù)和json.dump()函數(shù)。
import json
data = {
'name' : 'ACME',
'shares' : 100,
'price' : 542.23
}
json_str = json.dumps(data)
data = json.loads(json_str)
# Writing JSON data to file
with open('data.json', 'w') as f:
json.dump(data, f)
# Reading data back
with open('data.json', 'r') as f:
data = json.load(f)
默認(rèn)的類(lèi)型對(duì)應(yīng)如下:
| JSON | Python |
|---|---|
| object | dict |
| array | list |
| string | unicode |
| number (int) | int, long |
| number (real) | float |
| true | True |
| false | False |
| null | None |
其他數(shù)據(jù)類(lèi)型與Json之間的編碼和解碼
一般來(lái)說(shuō),Python對(duì)json的解析是list或dict之間的操作,如果需要其他類(lèi)型與json之間轉(zhuǎn)換,就需要object_hook參數(shù)。先定義一個(gè)類(lèi),將類(lèi)的字典初始化成json的key-value鍵值對(duì)。這樣,json的參數(shù)就變成了類(lèi)的屬性。
將一個(gè)JSON字典轉(zhuǎn)換為一個(gè)Python對(duì)象Python
>>> class JSONObject: ... def __init__(self, d): ... self.__dict__ = d ... >>> >>> data = json.loads(s, object_hook=JSONObject) >>> data.name 'ACME' >>> data.shares 50 >>> data.price 490.1
還可以通過(guò)指定“函數(shù)”來(lái)進(jìn)行轉(zhuǎn)換。
用函數(shù)來(lái)指定序列化的方法,即將對(duì)象的“屬性-值”對(duì)變成字典對(duì),函數(shù)返回一個(gè)字典,然后json.dumps會(huì)格式化這個(gè)字典。
如果是通過(guò)函數(shù)將json變成對(duì)象,首先獲得類(lèi)名,然后通過(guò)__new__來(lái)創(chuàng)建一個(gè)對(duì)象(不調(diào)用初始化函數(shù)),然后將json字典的各個(gè)屬性賦給對(duì)象。
使用函數(shù)指定json轉(zhuǎn)換方式Python
def serialize_instance(obj):
d = { '__classname__' : type(obj).__name__ }
d.update(vars(obj))
return d
# Dictionary mapping names to known classes
classes = {
'Point' : Point
}
def unserialize_object(d):
clsname = d.pop('__classname__', None)
if clsname:
cls = classes[clsname]
obj = cls.__new__(cls) # Make instance without calling __init__
for key, value in d.items():
setattr(obj, key, value)
return obj
else:
return d
使用方法如下:
>>> p = Point(2,3)
>>> s = json.dumps(p, default=serialize_instance)
>>> s
'{"__classname__": "Point", "y": 3, "x": 2}'
>>> a = json.loads(s, object_hook=unserialize_object)
>>> a
<__main__.Point object at 0x1017577d0>
>>> a.x
2
>>> a.y
3
總結(jié)
以上就是關(guān)于Python對(duì)Json解析的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家學(xué)習(xí)或者使用python能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流。
相關(guān)文章
Python對(duì)列表中的各項(xiàng)進(jìn)行關(guān)聯(lián)詳解
這篇文章主要給大家介紹了關(guān)于Python對(duì)列表中各項(xiàng)進(jìn)行關(guān)聯(lián)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-08-08
如何用Python編寫(xiě)一個(gè)電子考勤系統(tǒng)
這篇文章主要介紹了用Python編寫(xiě)一個(gè)電子考勤系統(tǒng),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02
Python?shapefile轉(zhuǎn)GeoJson的2種方式實(shí)例
geojson是地圖可視化系統(tǒng)中最常用的地理數(shù)據(jù)格式,幾乎所有主流地圖可視化庫(kù)或框架都支持geojson數(shù)據(jù)的加載,下面這篇文章主要給大家介紹了關(guān)于Python?shapefile轉(zhuǎn)GeoJson的2種方式的相關(guān)資料,需要的朋友可以參考下2023-03-03
opencv導(dǎo)入頭文件時(shí)報(bào)錯(cuò)#include的解決方法
這篇文章主要介紹了opencv導(dǎo)入頭文件時(shí)報(bào)錯(cuò)#include的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
python服務(wù)器端收發(fā)請(qǐng)求的實(shí)現(xiàn)代碼
這篇文章主要介紹了python服務(wù)器端收發(fā)請(qǐng)求的實(shí)現(xiàn)代碼,需要的朋友可以參考下2014-09-09
python如何繪制極坐標(biāo)輪廓圖contourf
這篇文章主要介紹了python如何繪制極坐標(biāo)輪廓圖contourf問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
Django框架實(shí)現(xiàn)在線(xiàn)考試系統(tǒng)的示例代碼
這篇文章主要介紹了Django框架實(shí)現(xiàn)在線(xiàn)考試系統(tǒng)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Python優(yōu)化列表接口進(jìn)行分頁(yè)示例實(shí)現(xiàn)
最近,在做測(cè)試開(kāi)發(fā)平臺(tái)的時(shí)候,需要對(duì)測(cè)試用例的列表進(jìn)行后端分頁(yè),在實(shí)際去寫(xiě)代碼和測(cè)試的過(guò)程中,發(fā)現(xiàn)這里面還是有些細(xì)節(jié)的,故想復(fù)盤(pán)一下2021-09-09

