Conversione del dizionario in JSON


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

Non riesco ad accedere ai miei dati in JSON. Che cosa sto facendo di sbagliato?

TypeError: string indices must be integers, not str

Risposte:


536

json.dumps()converte un dizionario in stroggetto, non un json(dict)oggetto! Quindi devi caricare il tuo strin a dictper usarlo usando il json.loads()metodo

Vedi json.dumps()come metodo di salvataggio e json.loads()come metodo di recupero.

Questo è l'esempio di codice che potrebbe aiutarti a capirlo di più:

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
non pensi che sia un po 'inefficiente caricare nuovamente il json in una variabile separata loaded_r, considerando che lo avevi già inserito r?
Tim

Ciao! Mi rendo conto che questa è una risposta molto vecchia, ma speravo che tu potessi chiarire una cosa. @TimCastelijns ha affermato che è inefficiente caricare nuovamente il json in una nuova variabile loaded_r. Il modo efficace per farlo sarebbe quello di indicare semplicemente r = json.loads (r)?
Schrodingers

2
@SchrodingersStat Hi. Non penso che questo cambi molto le prestazioni. Puoi controllare usando la funzione 'timeit'. Se vuoi davvero un caricamento / dump rapido json, puoi usare la libreria 'ujson'!
Iman Mirzadeh,

14
Sospetto che @TimCastelijns abbia frainteso l'intento di Imran. JSON viene caricato in una nuova variabile non perché si tratta di nuove informazioni, ma per mostrare che i valori nel nuovo dizionario, ovvero dopo la codifica JSON e la decodifica andata e ritorno, sono identici.
silente il

43

json.dumps()restituisce la rappresentazione in stringa JSON del picton dict. Vedi i documenti

Non puoi farlo r['rating']perché r è una stringa, non più un dict

Forse intendevi qualcosa del genere

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

2

Non è necessario convertirlo in una stringa utilizzando json.dumps()

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

È possibile ottenere i valori direttamente dall'oggetto dict.


1

Definire r come dizionario dovrebbe essere il trucco:

>>> r: dict = {'is_claimed': 'True', 'rating': 3.5}
>>> print(r['rating'])
3.5
>>> type(r)
<class 'dict'>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.