Как получить отсортированный список внутри словаря с помощью json.dumps ()

У меня есть следующая проблема: наличие словаря на языке python, например:

{"qqq": [{"bbb": "111"}, {"aaa": "333"}], "zzz": {"bbb": [5, 2, 1, 9]}} 

Я хотел бы получить упорядоченный объект json, например:

 '{"qqq": [{"aaa": "333"}, {"bbb": "111"}], "zzz": {"bbb": [1, 2, 5, 9]}}' 

На данный момент я использую следующее:

 class ListEncoder(json.JSONEncoder): def default(self, o): if isinstance(o, list): return sorted(o) return json.JSONEncoder.default(self, o) print json.dumps(c, sort_keys=True, cls=ListEncoder) 

Но два списка внутри моего объекта не отсортированы, и я получаю:

 '{"qqq": [{"bbb": "111"}, {"aaa": "333"}], "zzz": {"bbb": [5, 2, 1, 9]}}' 

вероятно, потому, что пользовательский JSONEncoder пропускает тип, который уже знает, как управлять (список).

ОБНОВИТЬ

Решение Martijn ниже прекрасно работает для примера выше, но, к сожалению, мне приходится управлять более сложными словарями с большей глубиной: например, следующие два

 a = { 'aaa': 'aaa', 'op': 'ccc', 'oppa': { 'ggg': [{'fff': 'ev'}], 'flt': { 'nnn': [ { 'mmm': [{'a_b_d': [6]},{'a_b_c': [6,7]}] }, { 'iii': [3, 2, 4, 5] } ] } }, 'rrr': {}, 'ttt': ['aaa-bbb-ccc'] } b = { 'aaa': 'aaa', 'op': 'ccc', 'oppa': { 'ggg': [{'fff': 'ev'}], 'flt': { 'nnn': [ { 'iii': [2, 3, 4, 5] }, { 'mmm': [{'a_b_c': [6,7]},{'a_b_d': [6]}] } ] } }, 'rrr': {}, 'ttt': ['aaa-bbb-ccc'] } 

Они были бы одинаковыми, если бы списки внутри одного были отсортированы. Но они не с классом выше, и я получаю две разные строки json:

 {"aaa": "aaa", "op": "ccc", "oppa": {"flt": {"nnn": [{"iii": [3, 2, 4, 1]}, {"mmm": [{"a_b_d": [6]}, {"a_b_c": [6, 7]}]}]}, "ggg": [{"fff": "ev"}]}, "rrr": {}, "ttt": ["aaa-bbb-ccc"]} {"aaa": "aaa", "op": "ccc", "oppa": {"flt": {"nnn": [{"iii": [2, 3, 4, 5]}, {"mmm": [{"a_b_c": [6, 7]}, {"a_b_d": [6]}]}]}, "ggg": [{"fff": "ev"}]}, "rrr": {}, "ttt": ["aaa-bbb-ccc"]} 

Любая идея исправить это?

One Solution collect form web for “Как получить отсортированный список внутри словаря с помощью json.dumps ()”

default не вызывается для списков; этот метод предназначен только для типов, которые кодировщик не знает, как обращаться. Вместо этого encode метод encode :

 class SortedListEncoder(json.JSONEncoder): def encode(self, obj): def sort_lists(item): if isinstance(item, list): return sorted(sort_lists(i) for i in item) elif isinstance(item, dict): return {k: sort_lists(v) for k, v in item.items()} else: return item return super(SortedListEncoder, self).encode(sort_lists(obj)) 

Это по сути просто сортирует все списки (рекурсивно) перед кодированием; это можно было бы сделать, прежде чем передать его json.dumps() но таким образом он является частью ответственности кодировщика, точно так же, как сортировка ключей.

Демо-версия:

 >>> json.dumps(c, sort_keys=True, cls=SortedListEncoder) '{"qqq": [{"aaa": "333"}, {"bbb": "111"}], "zzz": {"bbb": [1, 2, 5, 9]}}' >>> json.dumps(a, sort_keys=True, cls=SortedListEncoder) '{"aaa": "aaa", "op": "ccc", "oppa": {"flt": {"nnn": [{"iii": [2, 3, 4, 5]}, {"mmm": [{"a_b_c": [6, 7]}, {"a_b_d": [6]}]}]}, "ggg": [{"fff": "ev"}]}, "rrr": {}, "ttt": ["aaa-bbb-ccc"]}' >>> json.dumps(b, sort_keys=True, cls=SortedListEncoder) '{"aaa": "aaa", "op": "ccc", "oppa": {"flt": {"nnn": [{"iii": [2, 3, 4, 5]}, {"mmm": [{"a_b_c": [6, 7]}, {"a_b_d": [6]}]}]}, "ggg": [{"fff": "ev"}]}, "rrr": {}, "ttt": ["aaa-bbb-ccc"]}' 
  • Python Как получить каждый первый элемент в 2 Dimensional List
  • побитовые операции между элементами в списке
  • обертывание списка структур с помощью boost.python
  • Подсчитайте количество уникальных элементов списка кортежей, независимо от порядка в Python
  • Как эффективно создавать итерации с помощью большого списка списков в python?
  • Создание списка объектов из списка списков
  • Почему отсортированный список больше, чем несортированный список
  • Есть ли почтовый метод в .Net?
  •  
    Interesting Posts for Van-Lav

    Как установить атрибуты с помощью декораторов свойств?

    Создание py.test, покрытие и ток работают вместе: __init__.py в папке тестов?

    Smartsheet Data Tracker: AttributeError: объект 'dict' не имеет атрибута 'append'

    Python – ElementTree – не может использовать абсолютный путь для элемента

    В чем разница между параметрами set_client_CA_list_from_file () и M2Crypto и load_verify_info (), и когда вы будете использовать их?

    Пример кода matplotlib throws TclError

    Ввод данных в словарь

    Альтернативный метод, чтобы избежать цикла в кадре данных панд

    Проверьте источник Python 3 с Pylint, работающим с Python 2

    Использование многопроцессорного пула из задачи celery вызывает исключение

    Автоматическая ошибка Python sphinx

    Pyinstaller не корректирует импорт pycripto … иногда

    Ошибка при развертывании приложения python для конечных точек Google в локальном приложении с SDK приложения Engine

    Простой синтаксис для приведения элемента списка в начало в python?

    Получать пересекающиеся строки по двум массивам 2D numpy

    Python - лучший язык программирования в мире.