2009-04-03 41 views
31

En python tengo un diccionario que mapea tuplas en una lista de tuplas. p.ej.La mejor manera de codificar tuplas con json

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

Quiero ser capaz de codificar estos datos se utilizan con javascript, por lo que se veía en JSON pero parece claves deben ser cadenas por lo que mi tupla no funciona como una llave.

¿La mejor manera de manejar esto es codificarlo como "1,2" y luego analizarlo en algo que quiero en el javascript? ¿O hay una manera más inteligente de manejar esto?

Respuesta

19

Usted podría considerar diciendo

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

y luego, cuando lo que necesita para obtener el valor cabo, sólo puede analizar las claves a sí mismos como objetos JSON, que todos los navegadores modernos pueden hacer con el JSON.parse método integrado (estoy usando jQuery.each para repetir aquí pero se puede usar cualquier cosa):

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 
}); 

Por otro lado, es posible que desee simplemente la estructura de su objeto de manera diferente, por ejemplo,

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

de manera que en lugar de decir

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

que es la sintaxis de Javascript inválida, se podría decir

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

¡Gracias por la idea de diccionarios anidados! No hubiera pensado en eso. No estoy seguro de qué enfoque funcionará mejor para mí, pero parece una buena idea, ¡gracias! – f4hy

0

¿Podría ser simplemente una matriz bidimensional? Entonces puede usar números enteros como claves

+0

matrices de dos dimensiones son torpes en Python, de lo contrario, eso puede funcionar. – f4hy

2

Mi recomendación sería:

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

Todavía es analizar, pero dependiendo de cómo lo usa, puede ser más fácil en esta forma.

1

No puede usar una matriz como clave en JSON. Lo mejor que puedes hacer es codificarlo. Lo siento, pero realmente no hay otra manera sensata de hacerlo.

7

Si sus tuplas clave son realmente pares de número entero, entonces el más fácil y probablemente la mayoría el enfoque directo sería como usted sugiere ... codifíquelos a una cuerda. Esto se puede hacer en una sola línea:

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

Esto le conseguiría una estructura de datos javascript cuyas claves que luego podría dividir para obtener los puntos de nuevo:

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

Gracias por la edición nosklo ... todo el mundo necesita un buen editor :-) –

+0

Cool. ¡Gracias por los ejemplos de código también! – f4hy

+0

Para este ejemplo específico, tuple ('1,2'.split (', ')). Y si el ejemplo de la pregunta es The Norm, uno querría tuple (int (s) para s en '1,2'.split (', '))). – pythonlarry

Cuestiones relacionadas