Сортировка вывода JSON в Python - программирование
Подтвердить что ты не робот

Сортировка вывода JSON в Python

У меня проблема с JSON в python.

На самом деле, если я пытаюсь выполнить этот код, python дает мне отсортированную строку JSON!

Например:

values = {'profile' : 'testprofile', 
          'format': 'RSA_RC4_Sealed', 
          'enc_key' : base64.b64encode(chiave_da_inviare), 
          'request' : base64.b64encode(data)
      }


values_json = json.dumps(values, sort_keys=False, separators=(',', ':'))

и это результат:

{"profile":"testprofile","enc_key":"GBWo[...]NV6w==","request":"TFl[...]uYw==","format":"RSA_RC4_Sealed"}

Как вы можете видеть, я попытался использовать "sort_keys = False", но ничего не изменилось.

Как я могу остановить Python, сортируя строки JSON?

4b9b3361

Ответ 1

Вы сохраняете свои значения в python dict, который вообще не имеет собственного понятия о заказе, это просто ключ = > карта значений. Таким образом, ваши товары теряют весь порядок, когда вы помещаете их в переменную "values".

Фактически единственным способом получить детерминированный порядок будет использование "sort_keys = True", который, как я предполагаю, помещает их в буквенно-цифровой порядок. Почему этот порядок так важен?

Ответ 2

Попробуйте OrderedDict из стандартной библиотеки collections:

>>> import json
>>> from collections import OrderedDict
>>> values = OrderedDict([('profile','testprofile'), 
                          ('format', 'RSA_RC4_Sealed'), 
                          ('enc_key', '...'), 
                          ('request', '...')])
>>> json.dumps(values, sort_keys=False)
'{"profile": "testprofile", "format": "RSA_RC4_Sealed", "enc_key": "...", "request": "..."}'

К сожалению, эта функция New in version 2.7 для collections

Ответ 3

УпорядоченныйDict, как обсуждалось в другом месте, является большинством решений вашей проблемы, а "ObjDict" может быть даже лучше.

Однако, если вам нужен заказ, сохраненный при загрузке, вам также понадобится json.loads() для загрузки значений в OrderedDict. Для этого используйте

from collections import OrderedDict
values=json.loads(jsontext,object_pairs_hook=OrderedDict)

В противном случае, даже если json файл будет в порядке, этот заказ будет потерян при загрузке.

Возможно, лучшим решением будет использование "ObjDict" вместо OrderedDict. Для этого требуется объект установки pip. ObjDict по-прежнему поддерживает порядок, как и в OrderedDict, но также поддерживает JSON и улучшает обработку этого примера.

from objdict import ObjDict
values = ObjDict("""{"profile" : "testprofile",
      "format": "RSA_RC4_Sealed" }""")
values.enc_key = base64.b64encode(chiave_da_inviare)
values.request = base64.b64encode(data)

values_json = values.dumps(separators=(',', ':'))

Ответ 4

Если вы укажете sort_keys=False, тогда Python будет просто печатать элементы в том порядке, в каком они появляются в базовом объекте dict. В некоторых случаях это может совпадать с буквенно-цифровым порядком сортировки по умолчанию. В вашем примере клавиши ARE даже не сортируются, так как "формат" появляется после "запроса". Независимо от того, что параметр sort_keys по-прежнему действителен, о чем свидетельствует этот пример кода:

>>> import json
>>> json.dumps({"a":5, "b":6, "c":7}, sort_keys=False)
'{"a": 5, "c": 7, "b": 6}'

Ответ 5

Клавиши не сортируются: "профиль", "enc_key", "запрос", "формат".

Похоже, вы хотите, чтобы они отображались в том же порядке, в котором вы создали их в словаре, но словари неоткорректны, они не помнят введенный вами порядок.

Есть несколько вариантов SortedDict, которые вы можете использовать, но json encoder не будет знать, чтобы использовать его, чтобы получить ключи в том порядке, в котором вы хотите.

Ответ 6

Вы можете сортировать данные JSON, используя простой json.dumps как

sotred_json = json.dumps(values, sort_keys=True)

Если вы не хотите сортировать, просто предоставьте

unsotred_json = json.dumps(values)  

или же:

unsotred_json = json.dumps(values, sort_keys=False)