Несколько хороших новостей! Начиная с версии 3.6, реализация cPython сохранила порядок вставки словарей ( https://mail.python.org/pipermail/python-dev/2016-September/146327.html ). Это означает, что библиотека json теперь сохраняет порядок по умолчанию. Обратите внимание на разницу в поведении между Python 3.5 и 3.6. Код:
import json
data = json.loads('{"foo":1, "bar":2, "fiddle":{"bar":2, "foo":1}}')
print(json.dumps(data, indent=4))
В py3.5 результирующий порядок не определен:
{
"fiddle": {
"bar": 2,
"foo": 1
},
"bar": 2,
"foo": 1
}
В реализации Python 3.6 cPython:
{
"foo": 1,
"bar": 2,
"fiddle": {
"bar": 2,
"foo": 1
}
}
Действительно хорошая новость заключается в том, что это стало языковой спецификацией начиная с Python 3.7 (в отличие от деталей реализации cPython 3.6+): https://mail.python.org/pipermail/python-dev/2017-De .html
Итак, ответ на ваш вопрос теперь таков: обновитесь до python 3.6! :)