我有一些非常简单的代码,它将一个带有元组的字典作为键并将其转换为json:
In [11]:
import simplejson as json
In [12]:
data = {('category1', 'category2'): 4}
In [13]:
json.dumps(data)
但是,运行代码给了我:
TypeError: keys must be a string
我已经尝试过str()关键和我能找到的其他所有内容,但没有运气。
错误似乎很清楚:您的密钥必须是字符串。
如果我从你的问题和str()
-ify键中取样:
>>> 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
,
Flat优于嵌套。
但是,对于我的上下文,我有一些级别的嵌套dicts。所以我递归地对待它:
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}}'
调整此代码以匹配您的上下文。
请尝试以下方法。在转换为json之前,将字典的键设置为字符串而不是元组。将json转换回字典时,转换回list / tuple。
data =['category1', 'category2']
data_map = {}
data_map[','.join(data)]= 4
json.dumps(data_map)
一旦转换将json读取到字典,不要忘记将字符串转换回列表