Boas notícias! Desde a versão 3.6, a implementação do cPython preservou a ordem de inserção dos dicionários ( https://mail.python.org/pipermail/python-dev/2016-September/146327.html ). Isso significa que a biblioteca json agora está preservando a ordem por padrão. Observe a diferença de comportamento entre o python 3.5 e 3.6. O código:
import json
data = json.loads('{"foo":1, "bar":2, "fiddle":{"bar":2, "foo":1}}')
print(json.dumps(data, indent=4))
No py3.5, a ordem resultante é indefinida:
{
"fiddle": {
"bar": 2,
"foo": 1
},
"bar": 2,
"foo": 1
}
Na implementação cPython do python 3.6:
{
"foo": 1,
"bar": 2,
"fiddle": {
"bar": 2,
"foo": 1
}
}
A boa notícia é que isso se tornou uma especificação de linguagem a partir do python 3.7 (em oposição a um detalhe de implementação do cPython 3.6+): https://mail.python.org/pipermail/python-dev/2017-December/151283 .html
Portanto, a resposta para sua pergunta agora é: atualize para python 3.6! :)