国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

深入理解Python對(duì)Json的解析

2019-11-25 16:21:20
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

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 filewith open('data.json', 'w') as f: json.dump(data, f) # Reading data backwith 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.shares50>>> data.price490.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 classesclasses = { '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.x2>>> a.y3

總結(jié)

以上就是關(guān)于Python對(duì)Json解析的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家學(xué)習(xí)或者使用python能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 合阳县| 衡水市| 佛教| 宣城市| 化德县| 固始县| 小金县| 河西区| 常州市| 泾阳县| 靖宇县| 绥阳县| 甘南县| 德惠市| 迁西县| 霍林郭勒市| 冷水江市| 高清| 高平市| 保定市| 彰化县| 阳春市| 兴仁县| 辽源市| 吉林省| 宜兰市| 女性| 岳西县| 临江市| 澳门| 驻马店市| 凤阳县| 洛扎县| 云霄县| 赫章县| 楚雄市| 开江县| 凤山市| 崇文区| 溧阳市| 沙坪坝区|