Сортировка вывода 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?
Ответы
Ответ 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)