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
sheetal_158
quelle

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
Iman Mirzadeh
quelle
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']))
Tim
quelle
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.

user3273866
quelle
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'>
Aslan
quelle