2012-09-09 13 views
10

Piszę mały program w Pythonie i używam słownika, którego (podobnie jak w tytule) klucze i wartości są krotkami. Próbuję użyć json w następujący sposób:Zapisywanie słownika, którego kluczami są krotki z jsonem, pytonem

import json 
data = {(1,2,3):(a,b,c),(2,6,3):(6,3,2)} 
print json.dumps(data) 

Problem jest ciągle otrzymuję TypeError: keys must be a string.

Jak mogę to zrobić? Próbowałem przeglądając dokumentację Pythona, ale nie widziałem żadnego jasnego rozwiązania. Dzięki!

+5

Ale format JSON wymaga kluczy do ciągów znaków ... – kennytm

+0

Czy mogę przetworzyć go jako ciąg? – Yotam

+0

Dlaczego potrzebne są krotki jako klucze? – seriousdev

Odpowiedz

12

Musisz przekonwertować krotki do strun pierwszy:

json.dumps({str(k): v for k, v in data.iteritems()}) 

Oczywiście, będziesz skończyć z ciągów zamiast krotek dla kluczy:

'{"(1, 2, 3)": ["a", "b", "c"], "(2, 6, 3)": [6, 3, 2]}' 
+0

Byłoby interesujące wiedzieć, jak odwrócić tę akcję. –

+3

@RickyRobinson: 'ast.literal_eval()' będzie odtworzyć wartość Pythona z ciągu. –

+1

To działało dla mnie w python3: convert = {ast.literal_eval (k): v dla k, v w json.items()} – Johan

5

Jeśli chcesz załaduj swoje dane później, musisz i tak postprocesować. W związku z tym, że ja po prostu zrzucić 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')} 
0

dla Pythona 3 * użytkowników: oprócz @Martijn Pieters odpowiedź

dictonary.iteritems() nie jest prawidłowy, wymienić go dictionary.items():

json.dumps({str(k): v for k, v in data.items()}) 
0

Możesz użyć modułu ujson. ujson.dumps() akceptuje krotki jako klucze w słowniku. Możesz zainstalować ujson przez pip.