Ich habe ein seltsames Verhalten bei der Implementierung von in Python 3 bemerkt, nämlich die Reihenfolge der Schlüssel ändert sich jedes Mal, wenn ich das gleiche Objekt von der Ausführung zur Ausführung ablege. Das Googeln funktionierte nicht, da es mir egal ist, die Schlüssel zu sortieren, ich möchte nur, dass sie gleich bleiben! Hier ist ein Beispiel-Script:Wie behalte ich die JSON-Schlüsselreihenfolge mit 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))
Wenn ich dieses Skript ausführen bekomme ich verschiedene Ausgänge jedes Mal, zum Beispiel:
$ 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
}
Aber dann laufe ich es wieder und ich bekomme:
$ 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
}
ich verstehe, dass Wörterbücher ungeordnete Sammlungen sind und dass die Reihenfolge auf einer Hash-Funktion basiert; In Python 2 ist jedoch die Reihenfolge (was auch immer es ist) festgelegt und ändert sich nicht pro Ausführung. Die Schwierigkeit hier ist, dass es meine Tests schwierig zu laufen macht, weil ich die JSON-Ausgabe von zwei verschiedenen Modulen vergleichen muss!
Jede Idee, was los ist? Wie man es repariert? Beachten Sie, dass ich gerne ein OrderedDict oder eine Sortierung vermeiden möchte. Wichtig ist, dass die String-Darstellung zwischen den Ausführungen gleich bleibt. Auch dies ist nur zu Testzwecken und hat keine Auswirkungen auf die Implementierung meines Moduls.
Ich kann garantieren, dass der einzige Grund, dass die Reihenfolge auf Python 2 festgelegt ist, zufällig ist, es sei denn, 'sort_keys = True' –
@WayneWerner ist es nicht zufällig; Hash-Funktionen sind deterministisch - siehe die Kommentare unten, Änderungen der Reihenfolge nach Python 3.3 wegen der Einbeziehung eines zufälligen Hash-Seeds. – bbengfort
Nun, ich stehe korrigiert! Sehr interessant. –