2012-04-18 34 views
8

Tengo un problema cuando quiero convertir cadena json al diccionario Python. Tengo cadena como¿Cómo convertir cadena json a diccionario y guardar orden en las teclas?

s={"name":{"Saban:Saulic"},"price":{"koncert:1000"} ....} 

cuando escribo algo así como

tags=json.loads(s) 

I gtet diccionario pero el orden de las teclas no es lo mismo como en la cadena (que no es el nombre, precio ...). ¿Cómo convertir cadena json a diccionario y guardar orden en claves?

+2

diccionarios de Python no están ordenados, lo cual está bien porque normalmente se accede a las entradas * con la tecla * y si tiene que iterar sobre los elementos, el el orden por lo general no importa. Btw, 's' no es ni una cadena ni un diccionario JSON válido si se trata de una cadena. Parece que buscas una estructura diferente, como una matriz de objetos: '[{" name ":" ... "," price ":" ... "}, ...]'. Si proporciona alguna explicación para * por qué * necesita las claves en orden y proporciona un ejemplo correcto, entonces podemos ayudarlo mejor. –

+0

No existe realmente el "orden de las llaves" en un 'dict'. Puede iterar sobre ellos de a uno por vez, pero no hay control sobre el orden en que los recibe. –

+3

Creo que [esto previo] (http: // stackoverflow.com/questions/6921699/can-i-get-json-to-load-into-a-ordereddict-in-python) pregunta aquí en Stackoverflow proporciona una respuesta. – Alvin

Respuesta

21

Desde Python 2.7 que tienen OrderedDict módulo de collections

Esta especie de diccionario conserva el orden de inserción de elementos.

Desde documentación de Python:

json.load(fp[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])

Deserialize fp (un .read() - apoyar objeto de fichero que contiene un documento JSON) a un objeto Python.

Si el contenido de fp se codifican con una codificación basada ASCII otra de UTF-8 (por ejemplo latino-1), entonces un nombre de codificación apropiada debe ser especificado. Las codificaciones que no están basadas en ASCII (como UCS-2) no están permitidas en , y se deben envolver con codecs.getreader (codificación) (fp) o simplemente se decodifican en un objeto unicode y se pasan a loads().

object_hook es una función opcional que se llamará con el resultado de cualquier objeto decodificado literalmente (un dict). Se usará el valor de retorno de object_hook en lugar del dict. Esta función se puede usar para implementar decodificadores personalizados (por ejemplo, sugerencias de clase JSON-RPC).

object_pairs_hook es una función opcional que se llamará con el resultado de cualquier objeto literal decodificado con una lista ordenada de pares. Se usará el valor de retorno de object_pairs_hook en lugar del dict. Esta característica se puede usar para implementar decodificadores personalizados que dependen de en el orden en que se decodifican los pares clave y de valor (por ejemplo, colecciones .OrderedDict() recordará el orden de inserción). Si también se define object_hook, object_pairs_hook tiene prioridad.

Creo que se podría utilizar object_pairs_hook parámetro con collections.OrderedDict()

tags=json.loads(s, object_pairs_hook=collections.OrderedDict) 
Cuestiones relacionadas