Tanto Python dict
(antes de Python 3.7) como el objeto JSON son colecciones desordenadas. Puede pasar el sort_keys
parámetro para ordenar las claves:
>>> import json
>>> json.dumps({'a': 1, 'b': 2})
'{"b": 2, "a": 1}'
>>> json.dumps({'a': 1, 'b': 2}, sort_keys=True)
'{"a": 1, "b": 2}'
Si necesita un pedido en particular; podrías usarcollections.OrderedDict
:
>>> from collections import OrderedDict
>>> json.dumps(OrderedDict([("a", 1), ("b", 2)]))
'{"a": 1, "b": 2}'
>>> json.dumps(OrderedDict([("b", 2), ("a", 1)]))
'{"b": 2, "a": 1}'
Desde Python 3.6 , el orden del argumento de la palabra clave se conserva y lo anterior se puede reescribir usando una sintaxis más agradable:
>>> json.dumps(OrderedDict(a=1, b=2))
'{"a": 1, "b": 2}'
>>> json.dumps(OrderedDict(b=2, a=1))
'{"b": 2, "a": 1}'
Ver PEP 468 - Preservar el orden de los argumentos de palabras clave .
Si su entrada se da como JSON, para preservar el orden (para obtener OrderedDict
), puede pasar object_pair_hook
, como lo sugiere @Fred Yankowski :
>>> json.loads('{"a": 1, "b": 2}', object_pairs_hook=OrderedDict)
OrderedDict([('a', 1), ('b', 2)])
>>> json.loads('{"b": 2, "a": 1}', object_pairs_hook=OrderedDict)
OrderedDict([('b', 2), ('a', 1)])
OrderedDict()
, puede pasar undict
aOrderedDict()
, también puede pasar una lista de pares ordenadosdict()
, aunque el orden se pierde en ambos casos.ordereddict_literals
delcodetransformer
paquete (calidad alfa)d = json.load(f, object_pairs_hook=OrderedDict)
, un posteriorjson.dump(d)
conservará el orden de los elementos originales.Como otros han mencionado, el dict subyacente no está ordenado. Sin embargo, hay objetos OrderedDict en python. (Están construidos en pitones recientes, o puede usar esto: http://code.activestate.com/recipes/576693/ ).
Creo que las implementaciones más recientes de pythons json manejan correctamente los OrderedDicts incorporados, pero no estoy seguro (y no tengo acceso fácil para probar).
Las implementaciones antiguas de pythons simplejson no manejan bien los objetos OrderedDict ... y los convierten en dictos regulares antes de generarlos ... pero puede superar esto haciendo lo siguiente:
ahora usando esto obtenemos:
Lo cual es más o menos como se desea.
Otra alternativa sería especializar el codificador para usar directamente su clase de fila, y luego no necesitaría ningún dict intermedio o UnorderedDict.
fuente
sort_keys
queTrue
cuando se llamajson.dumps()
; para la estabilidad del pedido (para pruebas, almacenamiento en caché estable o confirmaciones de VCS), la clasificación de claves es suficiente.El orden de un diccionario no tiene ninguna relación con el orden en que se definió. Esto es cierto para todos los diccionarios, no solo para aquellos convertidos en JSON.
De hecho, el diccionario se puso "al revés" incluso antes de llegar a
json.dumps
:fuente
Hola, sé que es muy tarde para esta respuesta, pero agregue sort_keys y asigne falso de la siguiente manera:
esto funcionó para mí
fuente
json.dump () preservará el orden de su diccionario. Abra el archivo en un editor de texto y verá. Conservará el pedido independientemente de si le envía un OrderedDict.
Pero json.load () perderá el orden del objeto guardado a menos que le diga que se cargue en un OrderedDict (), lo que se hace con el parámetro object_pairs_hook como JFSebastian instruyó anteriormente.
De lo contrario, perdería el orden porque, en la operación habitual, carga el objeto de diccionario guardado en un dict regular y un dict regular no conserva el orden de los elementos que se le dan.
fuente
en JSON, como en Javascript, el orden de las claves de objeto no tiene sentido, por lo que realmente no importa en qué orden se muestren, es el mismo objeto.
fuente
dict
)