json.dump()给我“TypeError:键必须是一个字符串”

问题描述 投票:1回答:3

我有一些非常简单的代码,它将一个带有元组的字典作为键并将其转换为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()关键和我能找到的其他所有内容,但没有运气。

python json
3个回答
4
投票

错误似乎很清楚:您的密钥必须是字符串。

如果我从你的问题和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


1
投票

我知道The Zen of Python

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}}'

调整此代码以匹配您的上下文。


1
投票

请尝试以下方法。在转换为json之前,将字典的键设置为字符串而不是元组。将json转换回字典时,转换回list / tuple。

data  =['category1', 'category2']
data_map = {}
data_map[','.join(data)]= 4
json.dumps(data_map)

一旦转换将json读取到字典,不要忘记将字符串转换回列表

© www.soinside.com 2019 - 2024. All rights reserved.