2010-08-23 31 views
6

以None作爲關鍵字轉儲並加載字典時,會產生一個以「null」作爲關鍵字的字典。Python + JSON,None發生了什麼?

值不受影響,但如果實際存在字符串鍵「null」,情況會變得更糟。

我在這裏做錯了什麼?爲什麼不能用「無」鍵序列化/反序列化字典?

>>> json.loads(json.dumps({'123':None, None:'What happened to None?'})) 
{u'123': None, u'null': u'What happened to None?'} 
>>> json.loads(json.dumps({'123':None, None:'What happened to None?', 'null': 'boom'})) 
{u'123': None, u'null': u'boom'} 
+1

第二個代碼的Btw輸出似乎已經擺弄。 – 2014-09-29 09:26:04

回答

17

JSON對象是字符串到值的映射。如果您嘗試使用其他類型的密鑰,則會轉換爲字符串。

>>> json.loads(json.dumps({123: None})) 
{'123': None} 
>>> json.loads(json.dumps({None: None})) 
{'null': None} 
10

按照specificationNone是不是一個有效密鑰。就相當於一個JSON對象表達式,它看起來像

{ ..., null: ..., ... } 

這是無效的(即,不能使用的語法圖被產生。)

按理說,JSON模塊應該提出在一個異常序列化,而不是靜默地生成值的字符串表示。

編輯剛看到,該模塊的行爲是documented(有點含蓄):

如果skipkeys爲True(默認值:false),那麼字典鍵是一個基本類型的未( str,unicode,int,long,float,bool,None)將被跳過而不是引發TypeError。

所以看起來好像這種行爲是故意的(我仍然覺得現在的JSON規範有問題)。

+1

skipKeys對觀察到的行爲沒有影響。 「無」是基本類型,因此skipKeys = True不會導致「跳過」,就像skipKeys = False不會導致TypeError一樣。 我希望在文檔中有一個小記錄,例如:「對於可逆編碼,只能使用字符串作爲鍵。」 – safl 2010-08-23 15:26:14

-1

如@ dan04所示,None被轉換爲'null'。
一切都很好,值存儲在字典與「null:」發生了什麼沒有?'「

但隨後又來了另一個關鍵'null'。
因此,使用None /'null'-Key(「Nothing發生在None?」)的舊值被「繁榮」覆蓋。

+0

爲什麼downvotes,這個答案最新錯? – 2016-06-16 14:35:01