Konvertieren des Wörterbuchs in JSON


346
r = {'is_claimed': 'True', 'rating': 3.5}
r = json.dumps(r)
file.write(str(r['rating']))

Ich kann im JSON nicht auf meine Daten zugreifen. Was mache ich falsch?

TypeError: string indices must be integers, not str

Antworten:


535

json.dumps()konvertiert ein Wörterbuch in ein strObjekt, kein json(dict)Objekt! Sie müssen also Ihre strin eine laden dict, um sie mithilfe der json.loads()Methode zu verwenden

Siehe json.dumps()als Speichermethode und json.loads()als Abrufmethode.

Dies ist das Codebeispiel, das Ihnen helfen könnte, es besser zu verstehen:

import json

r = {'is_claimed': 'True', 'rating': 3.5}
r = json.dumps(r)
loaded_r = json.loads(r)
loaded_r['rating'] #Output 3.5
type(r) #Output str
type(loaded_r) #Output dict

11
Denken Sie nicht, dass es ein bisschen ineffizient ist, den JSON wieder in eine separate Variable zu laden loaded_r, wenn man bedenkt, dass Sie ihn bereits hatten r?
Tim

Hallo! Mir ist klar, dass dies eine sehr alte Antwort ist, aber ich hatte gehofft, Sie könnten eine Sache klären. @ TimCastelijns erwähnte, dass es ineffizient ist, den json wieder in eine neue Variable load_r zu laden. Wäre der effiziente Weg, dies zu tun, nur r = json.loads (r) anzugeben?
SchrodingersStat

2
@SchrodingersStat Hallo. Ich denke nicht, dass dies die Leistung stark verändert. Sie können dies mit der Funktion 'timeit' überprüfen. Wenn Sie wirklich ein schnelles Laden / Dump von json wünschen, können Sie die 'ujson'-Bibliothek verwenden!
Iman Mirzadeh

14
Ich vermute, @TimCastelijns hat Imrans Absicht missverstanden. Der JSON wird in eine neue Variable geladen, nicht weil es sich um neue Informationen handelt, sondern um zu zeigen, dass die Werte im neuen Wörterbuch, dh nach dem JSON-Codierungs- und -Decodierungs-Roundtrip, identisch sind.
Dumbledad

43

json.dumps()Gibt die JSON-Zeichenfolgendarstellung des Python-Dikts zurück. Siehe die Dokumente

Sie können nicht tun, r['rating']weil r eine Zeichenfolge ist, kein Diktat mehr

Vielleicht hast du so etwas gemeint

r = {'is_claimed': 'True', 'rating': 3.5}
json = json.dumps(r) # note i gave it a different name
file.write(str(r['rating']))

2

Sie müssen es nicht mithilfe von in einen String konvertieren json.dumps()

r = {'is_claimed': 'True', 'rating': 3.5}
file.write(r['is_claimed'])
file.write(str(r['rating']))

Sie können die Werte direkt vom dict-Objekt abrufen.


0

Das Definieren von r als Wörterbuch sollte den Trick machen:

>>> r: dict = {'is_claimed': 'True', 'rating': 3.5}
>>> print(r['rating'])
3.5
>>> type(r)
<class 'dict'>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.