Ответ 1
Сначала вам нужно преобразовать кортежи в строки:
json.dumps({str(k): v for k, v in data.iteritems()})
Конечно, вы получите строки вместо кортежей для ключей:
'{"(1, 2, 3)": ["a", "b", "c"], "(2, 6, 3)": [6, 3, 2]}'
Я пишу небольшую программу на python, и я использую словарь, чьи (как и название) ключи и значения являются кортежами. Я пытаюсь использовать json следующим образом
import json
data = {(1,2,3):(a,b,c),(2,6,3):(6,3,2)}
print json.dumps(data)
Проблема в том, что я продолжаю получать TypeError: keys must be a string
.
Как я могу это сделать? Я попытался взглянуть на документацию на python, но не нашел четкого решения. Спасибо!
Сначала вам нужно преобразовать кортежи в строки:
json.dumps({str(k): v for k, v in data.iteritems()})
Конечно, вы получите строки вместо кортежей для ключей:
'{"(1, 2, 3)": ["a", "b", "c"], "(2, 6, 3)": [6, 3, 2]}'
Если вы захотите загрузить свои данные позже, вы все равно должны его обработать. Поэтому я просто сбросил data.items()
:
>>> import json
>>> a, b, c = "abc"
>>> data = {(1,2,3):(a,b,c), (2,6,3):(6,3,2)}
>>> on_disk = json.dumps(data.items())
>>> on_disk
'[[[2, 6, 3], [6, 3, 2]], [[1, 2, 3], ["a", "b", "c"]]]'
>>> data_restored = dict(map(tuple, kv) for kv in json.loads(on_disk))
>>> data_restored
{(2, 6, 3): (6, 3, 2), (1, 2, 3): (u'a', u'b', u'c')}
Для пользователей Python 3 *: в дополнение к @Martijn Pieters ответ,
dictonary.iteritems()
недействителен, замените его на dictionary.items()
:
json.dumps({str(k): v for k, v in data.items()})
Вы можете использовать ujson-модуль. ujson.dumps() принимает кортежи как ключи в словаре. Вы можете установить ujson на pip.