Итак, я могу использовать OrderedDict в json.dump
. То есть OrderedDict может использоваться в качестве входных данных для JSON.
Но можно ли это использовать в качестве выхода? Если так, то как? В моем случае я бы хотел load
использовать OrderedDict, чтобы сохранить порядок ключей в файле.
Если нет, есть ли какое-то решение?
python
json
load
ordereddictionary
c00kiemonster
источник
источник
json.load
чтобы использовать OrderedDicts вместо Dicts в Python.Ответы:
Да, ты можешь. Указав
object_pairs_hook
аргумент JSONDecoder . Фактически, это точный пример, приведенный в документации.Вы можете передать этот параметр
json.loads
(если вам не нужен экземпляр Decoder для других целей) следующим образом:Использование
json.load
делается так же:источник
object_pairs_hook
, а не «каждая пара будет передаваться в object_pairs_hook»,json.load
не держит это упорядоченный по умолчанию, но похоже , что это только отражение того, что само по себе делает JSon -{}
неупорядоченны, но[]
в формате JSON будут заказаны , как описано здесьOrderedDict
будет использоваться для создания результирующего значения python.Простая версия для Python 2.7+
Или для Python 2.4 до 2.6
источник
simplejson
иordereddict
это отдельные библиотеки, которые нужно установить.loads('{}', object_pairs_hook=OrderedDict)
.Несколько хороших новостей! Начиная с версии 3.6, реализация cPython сохранила порядок вставки словарей ( https://mail.python.org/pipermail/python-dev/2016-September/146327.html ). Это означает, что библиотека json теперь сохраняет порядок по умолчанию. Обратите внимание на разницу в поведении между Python 3.5 и 3.6. Код:
В py3.5 результирующий порядок не определен:
В реализации Python 3.6 cPython:
Действительно хорошая новость заключается в том, что это стало языковой спецификацией начиная с Python 3.7 (в отличие от деталей реализации cPython 3.6+): https://mail.python.org/pipermail/python-dev/2017-De .html
Итак, ответ на ваш вопрос теперь таков: обновитесь до python 3.6! :)
источник
json.loads('{"2": 2, "1": 1}')
становится{'1': 1, '2': 2}
для меня.dict.__repr__
сортировку ключей, в то время как основной порядок сохранен. Другими словами,json.loads('{"2": 2, "1": 1}').items()
естьdict_items([('2', 2), ('1', 1)])
даже еслиrepr(json.loads('{"2": 2, "1": 1}'))
есть"{'1': 1, '2': 2}"
.Вы всегда можете выписать список ключей в дополнение к выводу dict, а затем восстановить его
OrderedDict
, перебирая список?источник
OrdereDict
s.В дополнение к выводу упорядоченного списка ключей вместе со словарем, другое низкотехнологичное решение, которое имеет явное преимущество, заключается в выводе (упорядоченного) списка пар ключ-значение
ordered_dict.items()
; загрузка простаOrderedDict(<list of key-value pairs>)
. Это обрабатывает упорядоченный словарь, несмотря на тот факт, что JSON не имеет этой концепции (словари JSON не имеют порядка).Это действительно приятно использовать тот факт, что
json
дамп OrderedDict в правильном порядке. Однако в общем случае неоправданно тяжело и необязательно иметь смысл читать все словари JSON как OrderedDict (черезobject_pairs_hook
аргумент), поэтому имеет смысл также явное преобразование только тех словарей, которые должны быть упорядочены.источник
Обычно используемая команда загрузки будет работать, если вы укажете параметр object_pairs_hook :
источник