TLDR: Ein dictionary in json behandelt alle Schlüssel als String, während ein Python Dictionay nicht nur zwischen dem Inhalt, sondern auch dem Datentyp unterscheidet (siehe Stackoverflow). Wenn man ein Dictionary in einem json speichert und das Dictionary daraus wieder lädt, muss man aufpassen, dass man nicht implizit den ursprünglichen numerischen Schlüssel in einen Schlüssel vom Datentyp string umwandelt.
Beobachtung
In einem Experiment verarbeite ich Daten in mehreren Durchläufen, berechne entsprechende Metriken und speichere diese Ergebnisse in einem Dictionary. Dieses Dictionary speixher ich dann in einer json-Datei mit den Nummern der Durchgänge als Key und den Metriken als value. Wenn ich die gespeicherte json-Datei in ein Dictionary lade, kann ich mein Experiment jederzeit nahtlos fortsetzen. Wenn ich jedoch die Daten als Dictionary lade, mein Experiment durchführe und das Dictionary wieder als json speichere, werden doppelte json-Schlüssel erzeugt.
Erklärung
Dieses Verhalten tritt auf, weil die Schlüssel in einem Python Dictionary nicht nur anhand des “Inhalts” des Schlüssels, sondern auch anhand seines Datentyps unterschieden werden können, während die Schlüssel in einem Json immer als Strings gespeichert werden. Ein kleines Beispiel soll das subtile Dilemma verdeutlichen.
import json
###########
# create a simple dictionary with a numeric key
##########
d = {}
d[1] = "hungsblog.com"
# output: d = {1: 'hungsblog.com'}
##########
# Dumping the dictionary into a json
##########
j = json.dumps(d, indent=4)
# output: j =
#{
# "1": "hungsblog.com",
#}
##########
# Loading the json into a dictionary and assigining the same numeric key
##########
d = json.loads(j)
d[1] = "hungsblog.com"
# output: d = {1: 'hungsblog.com', '1': 'hungsblog.com'}
Wir erstellen zunächst den Wert und ordnen ihn einem numerischen Schlüssel im Python Dictionary zu. Dann speichern wir ihn als json und laden ihn wieder als Dictionary. Da der Schlüssel nun jedoch als String statt als Integer geladen wird, erzeugen wir beim Einfügen praktisch denselben Schlüssel wie zuvor, und somit einen doppelten Schlüsseleintrag in unserem Python-Dictionary.