JSON序列化带元组作为键的字典

74 投票
11 回答
44539 浏览
提问于 2025-04-16 23:13

有没有办法在Python中把一个用元组作为键的字典转换成字符串呢?

比如说:

a = {(1, 2): 'a'}

直接用 json.dumps(a) 会出现这个错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/json/__init__.py", line 230, in dumps
    return _default_encoder.encode(obj)
  File "/usr/lib/python2.6/json/encoder.py", line 367, in encode
    chunks = list(self.iterencode(o))
  File "/usr/lib/python2.6/json/encoder.py", line 309, in _iterencode
    for chunk in self._iterencode_dict(o, markers):
  File "/usr/lib/python2.6/json/encoder.py", line 268, in _iterencode_dict
    raise TypeError("key {0!r} is not a string".format(key))
TypeError: key (1, 2) is not a string

11 个回答

10

你可以直接用 str((1,2)) 作为键,因为 JSON 只需要字符串作为键。不过如果你这么做的话,获取值的时候就得用 a[str((1,2))]

15
from json import loads, dumps
from ast import literal_eval

x = {(0, 1): 'la-la la', (0, 2): 'extricate'}

# save: convert each tuple key to a string before saving as json object
s = dumps({str(k): v for k, v in x.items()})

# load in two stages:
# (i) load json object
obj = loads(s)

# (ii) convert loaded keys from string back to tuple
d = {literal_eval(k): v for k, v in obj.items()}

请查看这个链接:https://stackoverflow.com/a/12337657/2455413

47

你不能把这个转成json格式,因为json对字典的键有更严格的要求,没那么灵活。

你可以把这个映射转换成一系列的键值对,像这样:

import json
def remap_keys(mapping):
    return [{'key':k, 'value': v} for k, v in mapping.iteritems()]
... 
json.dumps(remap_keys({(1, 2): 'foo'}))
>>> '[{"value": "foo", "key": [1, 2]}]'

撰写回答