Mam ten JSON w pliku:
{
"maps": [
{
"id": "blabla",
"iscategorical": "0"
},
{
"id": "blabla",
"iscategorical": "0"
}
],
"masks": [
"id": "valore"
],
"om_points": "value",
"parameters": [
"id": "valore"
]
}
Napisałem ten skrypt, aby wydrukować wszystkie dane JSON:
import json
from pprint import pprint
with open('data.json') as f:
data = json.load(f)
pprint(data)
Ten program zgłasza wyjątek:
Traceback (most recent call last):
File "<pyshell#1>", line 5, in <module>
data = json.load(f)
File "/usr/lib/python3.5/json/__init__.py", line 319, in loads
return _default_decoder.decode(s)
File "/usr/lib/python3.5/json/decoder.py", line 339, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib/python3.5/json/decoder.py", line 355, in raw_decode
obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting ',' delimiter: line 13 column 13 (char 213)
Jak mogę przeanalizować JSON i wyodrębnić jego wartości?
Odpowiedzi:
Twoje dane są nieprawidłowe w formacie JSON . Masz,
[]
kiedy powinieneś{}
:[]
są dla tablic JSON, które są wywoływanelist
w Pythonie{}
dotyczą obiektów JSON, które są wywoływanedict
w języku PythonOto jak powinien wyglądać Twój plik JSON:
Następnie możesz użyć swojego kodu:
Dzięki danym możesz teraz znaleźć takie wartości:
Wypróbuj je i sprawdź, czy to zaczyna mieć sens.
źródło
u'
przed każdym kluczem. Masz pomysł, dlaczego?Twój
data.json
powinien wyglądać tak:Twój kod powinien być:
Zauważ, że działa to tylko w Pythonie 2.6 i
with
nowszych wersjach , ponieważ zależy to od -statement . W Pythonie 2.5from __future__ import with_statement
, w Pythonie <= 2.4, patrz odpowiedź Justina Peela , na której opiera się ta odpowiedź.Możesz teraz uzyskać dostęp do pojedynczych wartości takich jak to:
źródło
data_file
open
edytowany dłużej niż to konieczne.pprint
ing w kontekściewith
-dotrzymujedata_file
otwarte dłużej.data["om_points"]
,data["masks"]["id"]
. Chodzi o to, że można osiągnąć dowolny poziom w słowniku, określając „ścieżki klucza”. Jeśli otrzymaszKeyError
wyjątek, oznacza to, że klucz nie istnieje na ścieżce. Uważaj na literówki lub sprawdź strukturę swojego słownika.Odpowiedź Justina Peela jest naprawdę pomocna, ale jeśli używasz języka Python 3, czytanie JSON powinno wyglądać następująco:
Uwaga: użyj
json.loads
zamiastjson.load
. W Pythonie 3json.loads
pobiera parametr ciągu.json.load
pobiera parametr obiektu podobny do pliku.data_file.read()
zwraca obiekt ciągu.Szczerze mówiąc, nie sądzę, aby w większości przypadków ładowanie wszystkich danych Json do pamięci stanowiło problem.
źródło
json.load
tego unikać.loads
w Pythonie 3?load
.źródło
json.loads
nie dekoduje wielu obiektów Json. W przeciwnym razie pojawi się błąd „Dodatkowe dane”.}
,]
lub"
). W związku z tym można rzeczywiście łączyć wiele obiektów w jednym ciągu lub w jednym pliku, bez dwuznaczności. Problem polega na tym, że analizator składni oczekujący pojedynczego obiektu zawiedzie, gdy zostanie przekazany więcej niż jeden obiekt..jsonl
(linie json), obiekty są oddzielone znakiem nowej linii, co sprawia, że wstępne przetwarzanie do parsowania jest banalne i pozwala do łatwego dzielenia / grupowania plików bez obawy o znaczniki początkowe / końcowe.„Ultra JSON” lub po prostu „ujson” poradzi sobie z
[]
wejściem do pliku JSON. Jeśli czytasz plik wejściowy JSON w swoim programie jako listę elementów JSON; takie jak[{[{}]}, {}, [], etc...]
ujson może obsłużyć dowolną dowolną kolejność list słowników, słowników list.Możesz znaleźć ujson w indeksie pakietu Python, a interfejs API jest prawie identyczny z biblioteką wbudowaną w Python
json
.ujson jest również znacznie szybszy, jeśli ładujesz większe pliki JSON. Możesz zobaczyć szczegóły dotyczące wydajności w porównaniu z innymi bibliotekami JSON Pythona w tym samym podanym linku.
źródło
Jeśli używasz Python3, możesz spróbować zmienić swój (
connection.json
plikowy) JSON na:Następnie za pomocą następującego kodu:
źródło
with
oświadczenia byłoby lepszeProszę przejść ze zmodyfikowanym
data.json
plikiem:Możesz zadzwonić lub wydrukować dane na konsoli, używając poniższych wierszy:
Oczekiwany wynik dla
print(data_item['parameters'][0]['id'])
:Oczekiwany wynik dla
print(data_item['parameters'][0]['id'])
:źródło
Istnieją dwa typy tej analizy.
Z pliku można użyć następujących opcji
W tym artykule wyjaśniono pełne analizowanie i uzyskiwanie wartości przy użyciu dwóch scenariuszy. Analizowanie JSON przy użyciu Pythona
źródło
Jako użytkownik python3 ,
Różnica pomiędzy
load
iloads
metod jest szczególnie ważne podczas odczytu danych z pliku json.Jak stwierdzono w dokumentach:
json.load:
json.loads:
Metoda json.load może bezpośrednio odczytać otwarty dokument json, ponieważ jest w stanie odczytać plik binarny.
W rezultacie Twoje dane Json są dostępne w formacie określonym zgodnie z tą tabelą konwersji:
https://docs.python.org/3.7/library/json.html#json-to-py-table
źródło