工作中和其他語(yǔ)言的工程師交流,合作與聯(lián)調(diào)中經(jīng)常會(huì)涉及到數(shù)據(jù)的傳輸,這個(gè)數(shù)據(jù)的傳輸通常為json字符串,這個(gè)json格式數(shù)據(jù)和python自身的dict數(shù)據(jù)對(duì)象非常像,所以很自然的會(huì)思考這兩者究竟區(qū)別在哪里?
首先,兩者不一樣
區(qū)別
- Python 的字典是一種數(shù)據(jù)結(jié)構(gòu),JSON 是一種數(shù)據(jù)格式。
json 就是一個(gè)根據(jù)某種約定格式編寫的純字符串,不具備任何數(shù)據(jù)結(jié)構(gòu)的特征。而 python 的字典的字符串表現(xiàn)形式的規(guī)則看上去和 json 類似,但是字典本身是一個(gè)完整的數(shù)據(jù)結(jié)構(gòu),實(shí)現(xiàn)了一切自身該有的算法。
- Python的字典key可以是任意可hash對(duì)象,json只能是字符串。
形式上有些相像,但JSON是純文本的,無(wú)法直接操作。
- 1.python dict 字符串用單引號(hào),json強(qiáng)制規(guī)定雙引號(hào)。
- 2.python dict 里可以嵌套tuple,json里只有array。 json.dumps({1:2}) 的結(jié)果是 {"1":2}; json.dumps((1,2)) 的結(jié)果是[1,2]
- 3.json key name 必須是字符串, python 是hashable, {(1,2):1} 在python里是合法的,因?yàn)閠uple是hashable type;{[1,2]:1} 在python里TypeError: unhashable "list"
- 4.json: true false null ; python:True False None
- python {"me": "我"} 是合法的; json 必須是 {"me": "\u6211"}
聯(lián)系
dict 存在于內(nèi)存中,可以被序列化成 json 格式的數(shù)據(jù)(string),之后這些數(shù)據(jù)就可以傳輸或者存儲(chǔ)了。
JSON 是一種數(shù)據(jù)傳輸格式。
也就是說(shuō),這些字符串以 JSON 這樣的格式來(lái)傳輸,至于你怎么 parse 這些信息,甚至是是否 parse,是否儲(chǔ)存,都不是 JSON 的事情。
用 Python 舉個(gè)例子: 某段程序可以把字符串 "{A:1, B:2}"
parse 成 一對(duì) tuple( ("A", 1), ("B", 2) )
而不是 dictionary {"A": 1, "B": 2}
。Python 的 dictionary 是對(duì) Hash Table 這一數(shù)據(jù)結(jié)構(gòu)的一種實(shí)現(xiàn)。它使用其內(nèi)置的哈希函數(shù)來(lái)規(guī)劃鍵對(duì)應(yīng)的內(nèi)容的儲(chǔ)存位置,從而獲得 O(1) 的數(shù)據(jù)讀取速度。所以 JSON 是一種數(shù)據(jù)傳輸格式,它能被解析成 Python 的 Dictionary 或者其他形式,但解析成什么內(nèi)容是和 JSON 這種格式無(wú)關(guān)的。Python 的 Dictionary 則是 Python 對(duì) Hash Table 的實(shí)現(xiàn),一套從存儲(chǔ)到提取都封裝好了的方案。