Mój projekt obecnie otrzymuje komunikat JSON w pythonie, z którego muszę wyciągnąć fragmenty informacji. W tym celu ustawmy na prosty JSON w ciągu:
jsonStr = '{"one" : "1", "two" : "2", "three" : "3"}'
Do tej pory generowałem żądania JSON przy użyciu listy json.dumps
, ale potem , przeciwnie do tego, myślę, że muszę użyć json.loads
. Jednak nie miałem z tym dużo szczęścia. Czy ktoś mógłby dostarczyć mi fragment kodu, który zwróciłby "2"
dane wejściowe z "two"
powyższego przykładu?
'
ograniczników ciągów pojedynczych cudzysłowów, być może przypadkowo utworzono reprezentację ciągu dla słowników Python. JSON zawsze"
będzie używać ograniczników . Jeśli tak, napraw kod, który generuje dane wyjściowe do użyciajson.dumps()
zamiaststr()
lubrepr()
, i przejdź do Konwersja reprezentacji ciągu słownika na słownik? aby dowiedzieć się, jak odzyskać dane w języku Python. Inne wskazówki, które znasz dosłownie Python? PoszukajNone
,True
lubFalse
JSON użyjenull
,true
ifalse
.'
ogranicznikami ciągów pojedynczych cudzysłowów), również tutaj: stackoverflow.com/questions/41168558/...Odpowiedzi:
Bardzo prosty:
źródło
import simplejson as json
. Zapomniałem wspomnieć, ale dziękuję :).load
metody zamiast.loads
Czasami twój json nie jest ciągiem. Na przykład, jeśli otrzymujesz json z adresu URL takiego:
musisz użyć json.load, a nie json.loads:
(łatwo zapomnieć: „s” oznacza „ciąg”)
źródło
W przypadku adresu URL lub pliku użyj
json.load()
. W przypadku łańcucha z zawartością .json użyjjson.loads()
.źródło
Oto prosty przykład, który może ci pomóc:
Dane wyjściowe powyższego kodu będą następujące:
Zauważ, że możesz ustawić argument ident dump, aby wydrukować go w ten sposób (na przykład, gdy używasz print json.dumps (data, wcięcie = 4)):
źródło
Może używać modułów json lub ast python:
źródło
ast.literal_eval()
funkcji dla JSON, ponieważ poza trywialnymi przykładami zawierającymi tylko tekst i liczby całkowite będziesz mieć problemy. JSON to nie Python . To, że niektóre JSON można analizowaćast.literal_eval()
, nie czyni z tego właściwego podejścia.r'{"foo": null, "bar": true, "baz": "\ud83e\udd26"}'
za pomocąast.literal_eval()
, ponieważ zawiera wartości null, wartość boolowską i pojedynczy punkt kodowy inny niż BMP. JSON reprezentuje te wartości inaczej niż to, w jaki sposób literały Python mogłyby je reprezentować.json.loads()
Z drugiej strony, nie ma problemów z tym wejściem i prawidłowo dekoduje że do{'foo': None, 'bar': True, 'baz': '🤦'}
.ast.literal_eval()
jest nieco wolniejszy i nie można go dostosowywać. Nigdy nie należy go używać do dekodowania JSON .