Я заметил некоторое странное поведение при реализации Python 3 json.dumps
, а именно: порядок ключей изменяется каждый раз, когда я выгружаю один и тот же объект из исполнения в исполнение. Googling не работал, так как я не забочусь о сортировке ключей, я просто хочу, чтобы они остались прежними! Ниже приведен пример сценария:Как сохранить порядок ключей JSON с Python 3 json.dumps?
import json
data = {
'number': 42,
'name': 'John Doe',
'email': '[email protected]',
'balance': 235.03,
'isadmin': False,
'groceries': [
'apples',
'bananas',
'pears',
],
'nested': {
'complex': True,
'value': 2153.23412
}
}
print(json.dumps(data, indent=2))
Когда я запускаю этот скрипт я получаю разные выходы каждый раз, когда, например:
$ python print_data.py
{
"groceries": [
"apples",
"bananas",
"pears"
],
"isadmin": false,
"nested": {
"value": 2153.23412,
"complex": true
},
"email": "[email protected]",
"number": 42,
"name": "John Doe",
"balance": 235.03
}
Но потом запустить его снова, и я получаю:
$ python print_data.py
{
"email": "[email protected]",
"balance": 235.03,
"name": "John Doe",
"nested": {
"value": 2153.23412,
"complex": true
},
"isadmin": false,
"groceries": [
"apples",
"bananas",
"pears"
],
"number": 42
}
Я понимаю, что словари представляют собой неупорядоченные коллекции и что порядок основан на хеш-функции; однако в Python 2 - порядок (независимо от того, что он есть) фиксирован и не изменяется для каждого исполнения. Трудность здесь состоит в том, что это затрудняет выполнение моих тестов, потому что мне нужно сравнить вывод JSON двух разных модулей!
Любая идея, что происходит? Как это исправить? Обратите внимание, что я бы хотел избежать использования OrderedDict или выполнения любой сортировки, и важно то, что строковое представление остается неизменным между исполнениями. Также это предназначено только для тестирования и не влияет на реализацию моего модуля.
Я могу гарантировать, что единственная причина, по которой заказ зафиксирован на Python 2, является случайным, если только 'sort_keys = True' –
@WayneWerner это не случайно; хэш-функции детерминированы - см. комментарии ниже, изменения порядка после Python 3.3 из-за включения случайного хэш-семени. – bbengfort
Ну, я стою исправлено! Очень интересно. –