Ho notato alcuni strani comportamenti sull'implementazione di Python 3 json.dumps
, ovvero l'ordine della chiave cambia ogni volta che eseguo il dump dello stesso oggetto dall'esecuzione all'esecuzione. Googling non funzionava dato che non mi importa di ordinare le chiavi, voglio solo che rimangano le stesse! Ecco uno script di esempio:Come mantenere fisso l'ordine della chiave JSON con 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))
Quando eseguo questo script ottengo diverse uscite ogni volta, per esempio:
$ 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
}
Ma poi lo eseguo di nuovo e ottengo:
$ 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
}
Capisco che i dizionari siano raccolte non ordinate e che l'ordine sia basato su una funzione hash; tuttavia in Python 2 l'ordine (qualunque esso sia) è fisso e non cambia in base all'esecuzione. La difficoltà qui è che rende difficile eseguire i miei test perché ho bisogno di confrontare l'output JSON di due diversi moduli!
Qualche idea su cosa sta succedendo? Come sistemarlo? Nota che mi piacerebbe evitare l'uso di OrderedDict o l'esecuzione di qualsiasi ordinamento e l'importante è che la rappresentazione della stringa rimanga la stessa tra le esecuzioni. Anche questo è solo a scopo di test e non ha alcun effetto sull'implementazione del mio modulo.
Posso garantire che l'unico motivo per cui l'ordine è fisso su Python 2 è accidentale, a meno che 'sort_keys = True' –
@WayneWerner non sia accidentale; le funzioni di hash sono deterministiche - vedi i commenti qui sotto, cambia l'ordine dopo Python 3.3 a causa dell'inclusione di un seme di hash casuale. – bbengfort
Bene, sono corretto! Molto interessante. –