И Python dict
(до Python 3.7), и объект JSON являются неупорядоченными коллекциями. Вы можете передать sort_keys
параметр, чтобы отсортировать ключи:
>>> 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}'
Если вам нужен определенный заказ; Вы можете использоватьcollections.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}'
Начиная с Python 3.6 , порядок аргументов ключевого слова сохраняется, и вышесказанное можно переписать с использованием более приятного синтаксиса:
>>> json.dumps(OrderedDict(a=1, b=2))
'{"a": 1, "b": 2}'
>>> json.dumps(OrderedDict(b=2, a=1))
'{"b": 2, "a": 1}'
См. PEP 468 - Сохранение порядка аргументов ключевого слова .
Если ваш ввод задан как JSON, то для сохранения порядка (для получения OrderedDict
) вы можете передать object_pair_hook
, как предлагает @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()
, вы можете передатьdict
вOrderedDict()
, вы можете передать список упорядоченных пар , чтобыdict()
тоже - хотя порядок теряется в обоих этих случаях.ordereddict_literals
изcodetransformer
пакета (альфа-качество)d = json.load(f, object_pairs_hook=OrderedDict)
, позжеjson.dump(d)
будет сохранен порядок исходных элементов.Как уже упоминали другие, основной диктат неупорядочен. Однако в Python есть объекты OrderedDict. (Они встроены в последние питоны, или вы можете использовать это: http://code.activestate.com/recipes/576693/ ).
Я полагаю, что новые реализации Python JSON правильно обрабатывают встроенные OrderedDicts, но я не уверен (и у меня нет легкого доступа к тестированию).
Старые реализации pythons simplejson не очень хорошо обрабатывают объекты OrderedDict ... и преобразуют их в обычные диктовки перед их выводом ... но вы можете преодолеть это, выполнив следующие действия:
Теперь, используя это, мы получаем:
Что в значительной степени, как хотелось бы.
Другая альтернатива - специализировать кодировщик для непосредственного использования вашего класса строк, и тогда вам не понадобится промежуточный dict или UnorderedDict.
источник
sort_keys
наTrue
при вызовеjson.dumps()
; для стабильности заказа (для тестирования, стабильного кэширования или фиксации VCS) достаточно сортировки ключей.Порядок словаря не имеет никакого отношения к порядку, в котором он был определен. Это верно для всех словарей, а не только для тех, которые превращены в JSON.
Действительно, словарь был перевернут с ног на голову, прежде чем он даже достиг
json.dumps
:источник
эй, я знаю, что уже слишком поздно для этого ответа, но добавьте sort_keys и присвойте ему false следующим образом:
это сработало для меня
источник
json.dump () сохранит порядок вашего словаря. Откройте файл в текстовом редакторе, и вы увидите. Он сохранит порядок независимо от того, отправляете ли вы ему OrderedDict.
Но json.load () потеряет порядок сохраненного объекта, если вы не скажете ему загрузить в OrderedDict (), что делается с параметром object_pairs_hook, как указано выше в JFSebastian.
В противном случае он потерял бы порядок, потому что при обычной операции он загружает сохраненный объект словаря в обычный dict, а обычный dict не сохраняет порядок элементов, которые ему даны.
источник
в JSON, как и в Javascript, порядок ключей объектов не имеет смысла, поэтому не имеет значения, в каком порядке они отображаются, это один и тот же объект.
источник
dict
)