2015-06-03 65 views
-1

我有一些非常簡單的代碼,需要一個字典,元組作爲密鑰,並且把它變成JSON:那樣json.dump()給我「類型錯誤:鍵必須是一個字符串」

In [11]: 

import simplejson as json 
In [12]: 

data = {('category1', 'category2'): 4} 
In [13]: 

json.dumps(data) 

然而,運行代碼給我:

TypeError: keys must be a string 

我試過str()的鍵和其他所有我可以找到,但沒有運氣。

+3

你知道JSON格式嗎?它不允許像'('category1','category2')這樣的鍵 - 它根本就沒有元組。你將不得不重新組織你的數據。 – user2357112

+0

你可以通過像{「category1#category2」:4}這樣的元組創建字符串來破解它。 JSON本身不能用元組作爲鍵。 – Aditya

回答

1

錯誤似乎很清楚:您的鑰匙必須是字符串。

如果我從你的問題,str()化密鑰的例子:

>>> data = {str(('category1', 'category2')): 4} 

它工作得很好:

>>> json.dumps(data) 
'{"(\'category1\', \'category2\')": 4}' 

話雖如此,在你的位置,我會考慮你的鍵更具可讀性。也許是這樣的:

>>> data = dict((':'.join(k), v) for k,v in data.items()) 

這原來像('category1', 'category2')category1:category2的關鍵,

0

我知道The Zen of Python狀態

Flat is better than nested.

但是,對於我而言,我有嵌套類型的字典的一些水平。所以我遞歸處理它:

import json 

def key_to_json(data): 
    if data is None or isinstance(data, (bool, int, str)): 
     return data 
    if isinstance(data, (tuple, frozenset)): 
     return str(data) 
    raise TypeError 

def to_json(data): 
    if data is None or isinstance(data, (bool, int, tuple, range, str, list)): 
     return data 
    if isinstance(data, (set, frozenset)): 
     return sorted(data) 
    if isinstance(data, dict): 
     return {key_to_json(key): to_json(data[key]) for key in data} 
    raise TypeError 

data = {('category1', 'category2'): {frozenset(['cat1', 'cat2']): 1212}} 
json.dumps(to_json(data)) 
# '{"(\'category1\', \'category2\')": {"frozenset({\'cat2\', \'cat1\'})": 1212}}' 

調整此代碼以匹配您的上下文。

相關問題