Algunas buenas noticias! Desde la versión 3.6, la implementación de cPython ha preservado el orden de inserción de los diccionarios ( https://mail.python.org/pipermail/python-dev/2016-September/146327.html ). Esto significa que la biblioteca json ahora conserva el orden de forma predeterminada. Observe la diferencia de comportamiento entre python 3.5 y 3.6. El código:
import json
data = json.loads('{"foo":1, "bar":2, "fiddle":{"bar":2, "foo":1}}')
print(json.dumps(data, indent=4))
En py3.5 el orden resultante no está definido:
{
"fiddle": {
"bar": 2,
"foo": 1
},
"bar": 2,
"foo": 1
}
En la implementación de cPython de python 3.6:
{
"foo": 1,
"bar": 2,
"fiddle": {
"bar": 2,
"foo": 1
}
}
La gran noticia es que esto se ha convertido en una especificación de lenguaje a partir de python 3.7 (en oposición a un detalle de implementación de cPython 3.6+): https://mail.python.org/pipermail/python-dev/2017-December/151283 .html
Entonces la respuesta a su pregunta ahora es: ¡actualice a Python 3.6! :)