2009-04-03 25 views
31

W pythonie mam słownik, który odwzorowuje krotki na listę krotek. na przykładNajlepszy sposób kodowania krotek za pomocą json'a

{(1,2): [(2,3),(1,7)]}

Chcę móc kodować te dane używać go z javascript, więc zajrzałem do json, ale wydaje klucze muszą być ciągi więc moja krotka nie działa jako klucz.

Czy najlepszym sposobem na obsłużenie tego jest zakodowanie go jako "1,2", a następnie przeanalizowanie go w coś, co chcę w javascript? Czy istnieje bardziej sprytny sposób radzenia sobie z tym.

Odpowiedz

19

Można rozważyć mówiąc

{"[1,2]": [(2,3),(1,7)]} 

i wtedy, gdy trzeba uzyskać wartość out, można po prostu analizować samych klawiszy jako obiekty JSON, które wszystkie nowoczesne przeglądarki można zrobić z wbudowanym JSON.parse metody (używam jQuery.each iteracyjne tutaj, ale można użyć czegokolwiek):

var myjson = JSON.parse('{"[1,2]": [[2,3],[1,7]]}'); 
$.each(myjson, function(keystr,val){ 
    var key = JSON.parse(keystr); 
    // do something with key and val 
}); 

z drugiej strony, może chcesz po prostu uporządkować swój przedmiot w inny sposób, na przykład

{1: {2: [(2,3),(1,7)]}} 

tak, że zamiast mówić

myjson[1,2] // doesn't work 

który jest nieprawidłowy składni JavaScript, można powiedzieć

myjson[1][2] // returns [[2,3],[1,7]] 
+1

Dzięki za pomysł zagnieżdżonych słowników! Nie pomyślałbym o tym. Nie jestem pewien, które podejście będzie dla mnie lepsze, ale wydaje się, że to dobry pomysł, dzięki! – f4hy

0

Czy może to być po prostu dwuwymiarowa tablica? Następnie można użyć liczb całkowitych jak klucze

+0

dwie tablice wymiarowe są niezgrabne w python, w przeciwnym razie może działać. – f4hy

2

Moja rekomendacja byłoby:

{ "1": [ 
     { "2": [[2,3],[1,7]] } 
     ] 
} 

To wciąż parsowania, ale w zależności od tego, jak go używać, może być łatwiej w tej formie.

1

Nie można używać tablicy jako klucza w JSON. Najlepsze, co możesz zrobić, to zakodować. Przepraszam, ale nie ma na to innego rozsądnego sposobu.

7

Jeśli klucz krotki są naprawdę całkowite pary, następnie najprostszy i prawdopodobnie najbardziej proste podejście byłoby jak sugerujesz .... zakodować je na łańcuch. Można to zrobić w ciągu jednego-liner:

>>> simplejson.dumps(dict([("%d,%d" % k, v) for k, v in d.items()])) 
'{"1,2": [[2, 3], [1, 7]]}' 

Byłoby to Ci javascript strukturę danych, której klawisze można następnie podzielić, aby uzyskać punkty powrotem:

'1,2'.split(',') 
+0

Dzięki za edycję nosklo ... każdy potrzebuje dobrego edytora :-) –

+0

Cool. Dzięki za próbki kodu też! – f4hy

+0

Dla tego konkretnego przykładu, krotka ("1,2" .split (",")). A jeśli przykład pytania brzmi "Norma", to chciałbyś mieć krotkę (int (s) dla s w "1,2" .split (","))). – pythonlarry

Powiązane problemy