Сортировка вывода JSON в Python - PullRequest
56 голосов
/ 05 мая 2010

У меня проблема с 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?

Ответы [ 6 ]

92 голосов
/ 23 мая 2012

Попробуйте 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

51 голосов
/ 05 мая 2010

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

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

14 голосов
/ 06 февраля 2016

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

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

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

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

Возможно, еще лучшим решением является использование ObjDict вместо OrderedDict. Это требует установки пипа. 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=(',', ':'))
6 голосов
/ 05 мая 2010

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

>>> import json
>>> json.dumps({"a":5, "b":6, "c":7}, sort_keys=False)
'{"a": 5, "c": 7, "b": 6}'
4 голосов
/ 05 мая 2010

Ключи не отсортированы: "profile", "enc_key", "request", "format".

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

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

2 голосов
/ 19 июля 2018

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

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

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

unsotred_json = json.dumps(values)  

или

unsotred_json = json.dumps(values, sort_keys=False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...