Eu gostaria de armazenar um objeto com uma chave complexa (tupla) em JSON, por exemplo:
obj = {("a", "1", "", "b") : "1"}
Mas usando:
import json
json.dumps(obj)
resulta no seguinte erro:
TypeError: keys must be a string
Qual é a maneira mais rápida / melhor de convertê-lo em JSON e descompactá-lo mais tarde?
Observe que ele deve ser armazenado em um banco de dados JSON típico (por exemplo, Cloudant / CouchDB / ElasticSearch).
Além disso, eu acho que é muito prático usar a tupla no meu programa, e assim preferir acabar com um dict contendo tuplas como chaves (depois de carregar o JSON).
Respostas:
1 para resposta № 1Eu acho que existem duas soluções alternativas que você pode usar.
Armazene os dados como uma lista de tuplas, em vez de um dicionário. Note que você terá que transformar as listas não ajustáveis em tuplas ao recriar o dicionário.
>>> json.dumps(obj.items()) "[[["a", "1", "", "b"], "1"]]" >>> {tuple(x): y for x, y in json.loads(_)} {(u"a", u"1", u"", u"b"): u"1"}
Converta as tuplas em strings e, em seguida, analise essas strings de volta às tuplas ao recuperar os valores.
>>> import ast >>> json.dumps({repr(x): y for x, y in obj.items()}) "{"("a", "1", "", "b")": "1"}" >>> {ast.literal_eval(x): y for x, y in json.loads(_).items()} {("a", "1", "", "b"): u"1"}