這篇文章的由來是因爲上一篇發送post請求的接口時候,參數傳字典(dict)和json的緣故,由於python中,json和dict很是相似,都是key-value的形式,爲啥還要這麼傳參,在羣裏問了一些人,也說不出個因此然了,仍是本身動手豐衣足javascript
食,因此纔有這篇和編輯分類格格不入的文章。來先看一下它們各自的定義。java
python中,json和dict很是相似,都是key-value的形式,並且json、dict也能夠很是方便的經過dumps、loads互轉。既然都是key-value格式,爲啥還須要進行格式轉換?python
json(JavaScript Object Notation)
json
json:是一種數據格式,是純字符串。能夠被解析成Python的dict或者其餘形式。數組
dict:是一個完整的數據結構,是對Hash Table這一數據結構的一種實現,是一套從存儲到提取都封裝好了的方案。它使用內置的哈希函數來規劃key對應value的存儲位置,從而得到O(1)的數據讀取速度。數據結構
一、json的key只能是字符串,python的dict能夠是任何可hash對象(hashtable type); 函數
二、json的key能夠是有序、重複的;dict的key不能夠重複。post
三、json的value只能是字符串、浮點數、布爾值或者null,或者它們構成的數組或者對象。ui
四、json任意key存在默認值undefined,dict默認沒有默認值;編碼
五、json訪問方式能夠是[],也能夠是.,遍歷方式分in、of;dict的value僅能夠下標訪問。
六、json的字符串強制雙引號,dict字符串能夠單引號、雙引號;
七、dict能夠嵌套tuple,json裏只有數組。
八、json:true、false、null
九、python:True、False、None
十、json中文必須是unicode編碼,如"\u6211".
十一、json的類型是字符串,字典的類型是字典。
一個對象當其聲明週期內的hash值不發生改變,並且能夠跟其餘對象進行比較時,這個對象就是hashtable的。
一、python中的基本類型都是Hashtable,如str、bytes、數字類型、tuple等;
二、用戶自定義的類型默認都是hashtable,由於它們的hash值就是id()值;
三、frozenset始終都是hashtable的,由於它們全部的項目都是被定義成hashtable的;
四、只有當tuple內的全部項都是hashtable的時候,tuple纔是hashtable;
實際上JSON就是Python字典的字符串表示,可是字典做爲一個複雜對象是沒法直接轉換成定義它的代碼的字符串,字典是一個數據的結構,而json只是一個具備必定規則的字符串,方便在不一樣平臺上處理其中包含的數據。
但本質上來說,字典是一種數據結構,json是一種格式;字典有不少內置函數,有多種調用方法,而json是數據打包的一種格式,並不像字典具有操做性,而且是格式就會有一些形式上的限制,好比json的格式要求必須且只能使用雙引號做爲
key或者值的邊界符號,不能使用單引號,並且「key」必須使用邊界符(雙引號),但字典就無所謂了。
形式上的相近也讓python提供了json.loads()轉換函數,方便json數據的調用。