Konwertowanie słownika na JSON

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

Nie mogę uzyskać dostępu do moich danych w JSON. Co ja robię źle?

TypeError: string indices must be integers, not str
sheetal_158
źródło

Odpowiedzi:

536

json.dumps()konwertuje słownik na strobiekt, a nie json(dict)obiekt! Musisz więc załadować swój strplik, dictaby użyć go za pomocą json.loads()metody

Zobacz json.dumps()jako metodę zapisu i json.loads()jako metodę pobierania.

Oto przykładowy kod, który może pomóc Ci lepiej to zrozumieć:

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
źródło
11
nie sądzisz, że ładowanie jsona z powrotem do osobnej zmiennej jest nieco nieefektywne loaded_r, biorąc pod uwagę, że już go masz r?
Tim
Cześć! Zdaję sobie sprawę, że to bardzo stara odpowiedź, ale miałem nadzieję, że uda ci się wyjaśnić jedno. @TimCastelijns wspomniał, że nieefektywne jest ładowanie jsona z powrotem do nowej zmiennej load_r. Czy skutecznym sposobem na zrobienie tego byłoby po prostu podanie r = json.loads (r)?
SchrodingersStat
2
@SchrodingersStat Hi. Nie sądzę, że to bardzo zmienia wydajność. Możesz to sprawdzić za pomocą funkcji „timeit”. Jeśli naprawdę chcesz szybkiego ładowania / zrzutu jsona, możesz skorzystać z biblioteki ujson!
Iman Mirzadeh
14
Podejrzewam, że @ TimCastelijns źle zrozumiał intencje Imrana. JSON jest ładowany do nowej zmiennej nie dlatego, że jest to nowa informacja, ale aby pokazać, że wartości w nowym słowniku, tj. Po kodowaniu i dekodowaniu JSON w obie strony, są identyczne.
dumbledad
43

json.dumps()zwraca reprezentację ciągu JSON słownika python. Zobacz dokumenty

Nie możesz tego zrobić, r['rating']ponieważ r jest ciągiem, a nie dyktonem

Być może miałeś na myśli coś takiego

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

Nie trzeba konwertować go w ciągu za pomocą json.dumps()

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

Możesz pobrać wartości bezpośrednio z obiektu dict.

użytkownik3273866
źródło
1

Zdefiniowanie r jako słownika powinno załatwić sprawę:

>>> r: dict = {'is_claimed': 'True', 'rating': 3.5}
>>> print(r['rating'])
3.5
>>> type(r)
<class 'dict'>
Aslan
źródło