Przewodnik programisty po danych Python i JSON

Ostatnia aktualizacja: 12/29/2025
  • Format JSON jest czytelnie odwzorowany na podstawowe typy języka Python, a obiekty i tablice są reprezentowane przez słowniki i listy, co upraszcza wymianę danych.
  • Moduł json języka Python udostępnia elastyczne funkcje zrzutu/ładowania z opcjami estetycznego drukowania, niestandardowymi enkoderami i stabilną kolejnością kluczy.
  • Odczyt, zapis i analiza zagnieżdżonych danych JSON z plików i interfejsów API opierają się na tych samych podstawowych narzędziach, w połączeniu z ostrożną obsługą błędów.
  • Oprócz podstawowej serializacji, JSON w Pythonie obsługuje formatowanie, walidację i integrację z innymi formatami danych, takimi jak CSV i XML.

Samouczek dotyczący danych JSON w Pythonie

JSON po cichu stał się domyślnym językiem danych w sieci, A jeśli piszesz w Pythonie, natkniesz się na niego wszędzie: w API, plikach konfiguracyjnych, małych „bazach danych” dla projektów pobocznych, logach, a nawet w testach. Zrozumienie, jak typy danych Pythona mapują się na JSON i jak json Moduł naprawdę działa jest jedną z tych umiejętności, które nagle sprawiają, że wiele codziennych zadań staje się prostszych.

W tym przewodniku omówimy JSON z punktu widzenia programisty Pythona, wyjaśniając, czym jest JSON, jaki jest jego związek z JavaScript, jakie typy Pythona może reprezentować oraz jak analizować, generować, drukować, sprawdzać poprawność i dostosowywać JSON za pomocą jsonPrzyjrzymy się również rzeczywistym przypadkom użycia, takim jak praca z plikami i interfejsami API, a także sztuczkom obsługi zagnieżdżonych danych i przypadków brzegowych, takich jak błędy lub wartości specjalne, np. NaN i nieskończoności.

Czym jest JSON i jaki ma związek z danymi Pythona

JSON, skrót od JavaScript Object Notation, to format tekstowy dla danych strukturalnych którego składnia pierwotnie pochodziła z obiektów i tablic JavaScript. Pomimo korzeni JavaScript, JSON jest niezależny od języka i jest obsługiwany przez praktycznie każdy współczesny język, w tym Python, co czyni go idealnym do wymiany danych między usługami, klientami i serwerami.

Koncepcyjnie JSON wykorzystuje tylko dwa złożone bloki konstrukcyjne: JavaScript przedmiot i JavaScript szykObiekt zachowuje się jak słownik Pythona, a tablica jak lista Pythona. Dzięki tym dwóm elementom oraz niewielkiemu zestawowi typów prymitywnych, JSON może opisywać złożone zagnieżdżone struktury danych.

Obiekt w JavaScript (i JSON) wygląda następująco: {"key1": value1, "key2": value2}To zbiór par klucz-wartość, gdzie klucze to ciągi znaków, a wartości mogą być dowolnymi prawidłowymi wartościami JSON (w tym innymi obiektami lub tablicami). To ściśle odpowiada Pythonowi. dict.

Tablica w JavaScript (i JSON) jest podobna do listy w Pythonie: Jest to uporządkowany zbiór wartości, ponownie wykorzystujący dowolny poprawny typ JSON. Obiekty i tablice można dowolnie zagnieżdżać, aby modelować rozbudowane dane, takie jak profile użytkowników, drzewa konfiguracji lub odpowiedzi API.

Mapowanie między typami JSON i typami Pythona jest bardzo proste, Dlatego czasami słyszy się żartobliwe określenie „PYON” (Python Object Notation). Podczas kodowania lub dekodowania JSON w Pythonie obowiązują następujące zasady:

  • Obiekt JSON → Python dict
  • Tablica JSON → Python list
  • Ciąg JSON → Python str
  • Liczba JSON (liczba całkowita) → Python int
  • Liczba JSON (rzeczywista) → Python float
  • JSON true Python True
  • JSON false Python False
  • JSON null Python None

Jednym z ważnych ograniczeń jest to, że klucze obiektów JSON są zawsze ciągami znaków, więc jeśli kodujesz Pythona dict W przypadku kluczy niebędących ciągami znaków (np. liczbami całkowitymi lub krotkami) klucze te zostaną przekształcone w ciągi znaków lub spowodują błędy w zależności od ustawień. JSON doskonale nadaje się do utrwalania danych strukturalnych, takich jak konfiguracje czy rekordy, ale nie Ogólny mechanizm piklowania dowolnych obiektów Pythona.

Mapowanie danych JSON w Pythonie

Wbudowany moduł JSON w Pythonie

Python jest dostarczany ze standardowym modułem bibliotecznym o nazwie json, który zapewnia wszystko, czego potrzebujesz do pracy z JSON: parsowanie ciągów znaków, ładowanie z plików, serializację obiektów Pythona oraz dostosowywanie sposobu kodowania i dekodowania danych. Do typowych zadań JSON nie potrzebujesz żadnych zewnętrznych zależności.

Cztery podstawowe funkcje, z których będziesz korzystać najczęściej to: json.dumps() oraz json.dump() do konwersji obiektów Pythona do formatu JSON i json.loads() oraz json.load() do przejścia z JSON-a z powrotem do typów Pythona. Wersje z literą „s” działają z ciągami znaków, podczas gdy wersje bez litery „s” działają z obiektami plikopodobnymi.

json koder domyślnie obsługuje określony zestaw typów Pythona, mianowicie dict, list, tuple (jako tablice), str, liczby (int, floati wyliczeniami opartymi na liczbach całkowitych/zmiennoprzecinkowych) oraz trzema specjalnymi singletonami True, False, None. Są one konwertowane do odpowiedników JSON zgodnie z mapowaniem opisanym wcześniej.

Jeśli musisz serializować niestandardowe obiekty lub typy danych, projekt modułu jest rozszerzalny: można utworzyć podklasę kodera JSON i zaimplementować default() metodę lub przekazać niestandardową default funkcja w json.dump() / json.dumps()Ten niestandardowy hak powinien zwracać coś, co można serializować w formacie JSON (np. dict or list), lub podnieść TypeError jeśli nie wie, jak obchodzić się z danym obiektem.

Pod maską moduł oferuje również takie metody, jak: encode() oraz iterencode(), które konwertują dane Pythona na ciągi JSON, z iterencode() przyrostowe generowanie zakodowanych fragmentów. Są one rzadziej używane bezpośrednio, ale warto o nich wiedzieć, jeśli potrzebujesz przesyłać strumieniowo bardzo duże odpowiedzi JSON.

Konwersja obiektów Pythona do JSON

Gdy chcesz przekształcić dane Pythona w tekst JSON, użyj json.dump() or json.dumps(), w zależności od tego, czy chcesz zapisać dane bezpośrednio do pliku, czy pobrać ciąg JSON do pamięci. Obie funkcje mają te same podstawowe parametry, które pozwalają kontrolować przebieg konwersji.

Funkcja json.dump(obj, fp, ...) przyjmuje obiekt Pythona i obiekt podobny do pliku, i zapisuje reprezentację JSON obj do tego pliku. Jego odpowiednik w pamięci, json.dumps(obj, ...), zwraca ciąg JSON zamiast zapisywać do pliku. Oba akceptują szereg argumentów kluczowych, takich jak skipkeys, ensure_ascii, check_circular, allow_nan, indent, separators, default, sort_keys.

Każda z tych opcji modyfikuje zachowanie kodowania w sposób, który ma duże znaczenie w rzeczywistych projektach: możesz wybrać, czy pominąć nieprawidłowe klucze, wymusić wyjście ASCII, wydrukować wynik w sposób estetyczny, kontrolować odstępy, zdefiniować niestandardową serializację dla niestandardowych obiektów lub ustabilizować kolejność kluczy na potrzeby testów i porównywania.

Oto, co najważniejsze parametry oznaczają w praktyce:

  • skipkeys: jeśli ustawione na True, klucze słownika, które nie są typu str, int, float, bool or None są pomijane po cichu zamiast podnosić TypeErrorJeśli wolisz szybkie działanie w przypadku dziwnych kluczy, zostaw to tak False.
  • ensure_ascii: jeśli chodzi o komunikację i motywację True (domyślnie), znaki nie-ASCII i niedrukowalne są ukrywane (np. jako \uXXXX) więc wynik pozostaje czystym kodem ASCII. Kiedy FalseZnaki Unicode są zapisywane tak jak są, co zazwyczaj jest lepsze w przypadku konfiguracji i logów zrozumiałych dla człowieka.
  • check_circular: if True, koder sprawdza odwołania cykliczne na listach, słownikach i niestandardowo zakodowanych obiektach, aby zapobiec nieskończonej rekurencji. Ustawienie na False wyłącza tę sieć bezpieczeństwa i może prowadzić do RecursionError jeśli Twoje struktury są autoreferencyjne.
  • allow_nan: if True, specjalne wartości zmiennoprzecinkowe, takie jak NaN, Infinity, -Infinity są dozwolone i kodowane w sposób zgodny z JavaScript, nawet jeśli nie są ściśle poprawnym formatem JSON zgodnie ze specyfikacją. Jeśli Falsepróba zakodowania takich wartości spowoduje ValueError.
  • indent: Nieujemna liczba całkowita (lub ciąg znaków) kontrolująca ładną reprezentację. Liczba dodatnia oznacza liczbę spacji na poziom zagnieżdżenia. Ciąg znaków (np. "\t") służy bezpośrednio do wcięć. None (domyślnie) wybiera najbardziej zwartą reprezentację, bez zbędnych nowych linii ponad to, co jest wymagane.
  • separators: krotka (item_separator, key_separator) Kontrolowanie interpunkcji i odstępów między elementami oraz między kluczami a wartościami. Aby uzyskać najściślejszy JSON, zazwyczaj używa się (",", ":") aby usunąć wszystkie opcjonalne spacje.
  • default: Funkcja, która odbiera dowolny obiekt, którego koder nie potrafi obsłużyć. Musi zwrócić zamiennik, który można serializować w formacie JSON (np. dict or list), lub podnieść TypeError. To jest główna zasada umożliwiająca serializację własnych klas.
  • sort_keys: if TrueSłowniki są kodowane z posortowanymi kluczami. Jest to niezwykle przydatne w testach regresyjnych i w przypadku powtarzalnych wyników, gdy zależy nam na stabilności zrzutów JSON w różnych uruchomieniach.

Jako konkretny przykład wyobraź sobie, że masz mieszaną listę Pythona Zawierający liczby całkowite i słownik z nazwą, identyfikatorem i wynikiem zmiennoprzecinkowym. Możesz utworzyć i zapisać JSON w następujący sposób:

import pathlib
import json

path = pathlib.Path("myTextFile.json")
data =

with path.open(mode="wt") as f:
    json.dump(data, f)

print(json.dumps(data, indent=4))

Wydrukowany JSON będzie ładnie sformatowany dzięki indent=4, wyświetlając każdy element listy i klucz słownika w osobnym wierszu. Dzięki temu debugowanie i ręczna edycja są znacznie łatwiejsze w porównaniu z pojedynczą, gęstą linijką tekstu.

Analiza składniowa JSON-a z powrotem do Pythona

Aby przejść z tekstu JSON z powrotem do obiektów Pythona, używasz pasującej pary funkcji: json.load() (dla obiektów typu plik) i json.loads() (dla ciągów JSON). Funkcje te analizują dane wejściowe i odtwarzają typy Pythona zgodnie z tą samą tabelą mapowania, co poprzednio.

Podpisy wyglądają mniej więcej tak: json.load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, kw) oraz json.loads(s, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, kw). Na poziomie podstawowym można je wywołać, podając jedynie dane wejściowe w formacie JSON, ale dodatkowe argumenty otwierają drzwi do bardziej zaawansowanego sposobu analizy składniowej.

Haki takie jak object_hook oraz object_pairs_hook pozwala dostosować sposób, w jaki obiekty JSON są przekształcane w struktury Pythona, karmiąc cię albo zdekodowanym dict lub lista (key, value) odpowiednio pary. Jest to przydatne, jeśli chcesz tworzyć niestandardowe klasy bezpośrednio z JSON lub zachować kolejność w określony sposób.

Inne obiekty wywoływalne, takie jak parse_float, parse_int, parse_constant pozwalają kontrolować sposób interpretacji liczb i tokenów specjalnych. Na przykład możesz chcieć użyć Decimal zamiast float dla wartości pieniężnych lub przekształcić "NaN", "inf", "-inf" do wybranych przez Ciebie obiektów strażniczych.

Kontynuując wcześniejszy przykład, możesz odczytać napisany plik JSON w następujący sposób:

with path.open(mode="rt") as f:
    data = json.load(f)
print(data)

Wynikowym wynikiem będzie zwykła lista i słownik języka Python, na przykład , którymi można manipulować za pomocą wszystkich standardowych operacji Pythona. Z perspektywy kodu to znowu „tylko dane”.

Jakie typy Python może konwertować do JSON

Nie każdy obiekt Pythona można od razu przekształcić w JSON, Dlatego warto pamiętać o dozwolonym zestawie. Praktyczne enkodery obsługują typowe typy kontenerów i skalarów, a także wartości logiczne i Nonei mapować je na minimalny zestaw typów JSON.

Domyślnie możesz bezpiecznie przekazać następujące obiekty Pythona do json.dumps():

  • dict (zakodowane jako obiekty JSON)
  • list oraz tuple (zakodowane jako tablice JSON)
  • str (zakodowane jako ciągi JSON)
  • int oraz float (zakodowane jako liczby JSON)
  • True oraz False (zakodowane jako true oraz false)
  • None (zakodowane jako null)

Gdy Python koduje te dane, mapowanie z powrotem do JSON jest proste, i odwrotnie podczas dekodowania. Na przykład, Python tuple staje się tablicą JSON i otrzymujesz list ponownie załadować. Wyliczenia pochodzące z int or float mogą być również zakodowane jako liczby.

Wszystko inne wymaga dostosowania default treser (aby przekształcić obiekty w reprezentację serializowalną) lub spowoduje TypeError. To jest celowe: JSON jest przeznaczony do danych, a nie do dowolnych grafów obiektów z zachowaniem i metodami, które można serializować za pomocą pickle.

W przypadku większości codziennych prac ten podzbiór typów obejmuje większość przypadków użycia, w tym ładunki API, drzewa konfiguracji, preferencje użytkownika, podstawowe logi i małe pliki „podobne do baz danych” dla prototypów lub narzędzi dla pojedynczego użytkownika.

Ładny druk, kompaktowy wydruk i uporządkowane klawisze

Surowe dane wyjściowe JSON są zazwyczaj całkowicie poprawne, ale trudne do odczytania, Ponieważ często jest generowany bez zbędnych odstępów. Do debugowania, logowania lub udostępniania innym programistom, często potrzebujesz czytelnego, wciętego kodu JSON zamiast jednolinijkowego.

indent parametr json.dumps() jest główną dźwignią ładnego druku, Pozwala wskazać Pythonowi, ile spacji (lub jakiego ciągu znaków) użyć na każdym poziomie wcięcia. Typowy wybór to indent=4, chociaż niektóre bazy kodów preferują dwie spacje lub znaki tabulacji; konwencje stylistyczne różnią się w zależności od projektu.

separators argument pozwala na jeszcze dokładniejsze dostrojenie odstępów, podając krotkę taką jak (", ", ": ") domyślnie dla wyników przyjaznych dla człowieka. Jeśli chcesz uzyskać jak najbardziej zwartą reprezentację — na przykład, aby zmniejszyć rozmiar danych przesyłanych przez sieć — możesz ustawić separators=(",", ":") aby usunąć spacje po przecinkach i dwukropkach.

Jeśli zależy Ci na deterministycznym wyniku, na przykład w testach jednostkowych lub porównaniach migawek, aktywujący sort_keys=True Sprawia, że ​​koder generuje klucze słownika w kolejności sortowania. W ten sposób dwa przebiegi generujące semantycznie identyczne dane nie różnią się tylko dlatego, że słowniki wygenerowały klucze w innej kolejności.

Razem, indent, separators, sort_keys daje ci dużo kontroli nad tym, czy Twój JSON jest zoptymalizowany dla maszyn (kompaktowy, bez odstępów) lub dla ludzi (wcięty, wyrównany, o stabilnym kształcie w różnych przebiegach).

Zagnieżdżone dane, strategie analizy i wzorce dostępu

W rzeczywistym JSON-ie struktury płaskie są wyjątkiem; Zazwyczaj będziesz mieć do czynienia z zagnieżdżonymi obiektami i tablicami. Wyobraź sobie typowy rekord użytkownika w aplikacji e‑commerce: dane osobowe, zagnieżdżone adresy wysyłki, zagnieżdżone dane rozliczeniowe i ewentualnie listę zamówień – każdy z nich stanowi złożoną strukturę samą w sobie.

Podczas dekodowania JSON do Pythona zagnieżdżone dane stają się kombinacjami słowników i list, Dostęp do niego można uzyskać za pomocą standardowych wyszukiwań indeksów i kluczy. W przypadku struktur płytkich jest to proste: data, dataI tak dalej.

W przypadku struktur głęboko zagnieżdżonych lub dynamicznych możesz preferować bardziej ogólne podejście, Na przykład napisanie małej funkcji rekurencyjnej, która wyszukuje klucze lub przegląda drzewo słowników i list. Rozwiązania rekurencyjne są często krótsze i łatwiejsze do odczytania niż iteracyjne podczas przechodzenia przez dowolnie zagnieżdżone dane.

Dostęp do niezagnieżdżonego (płaskiego) JSON jest łatwiejszy bezpośrednio za pomocą zakodowanych na stałe kluczy, co może być całkowicie w porządku w przypadku małych narzędzi lub gdy masz pełną kontrolę nad danymi wejściowymi. Jednak podczas korzystania z zewnętrznych interfejsów API często pisze się małe funkcje pomocnicze, które hermetyzują strukturę, aby uniknąć rozproszenia. łańcuchy w całej bazie kodu.

Niezależnie od głębokości, to samo json.loads() zachowanie ma zastosowanie: Funkcja akceptuje ciąg JSON i generuje natywne typy Pythona, którymi można następnie manipulować za pomocą standardowych narzędzi Pythona. Nie jest wymagana żadna specjalna składnia poza standardową. dict oraz list indeksowanie.

Praca z plikami JSON: czytanie, zapisywanie i dołączanie

JSON to zaskakująco poręczny i lekki format przechowywania danych W przypadku małych projektów, plików konfiguracyjnych lub skryptów, które wymagają zachowania pewnego trwałego stanu. Zamiast od razu sięgać po całą bazę danych, często można sobie pozwolić na jeden lub dwa pliki JSON przez dłuższy czas.

Zapisywanie danych JSON do pliku zwykle odbywa się w dwóch etapach: serializować dane Pythona za pomocą json.dumps() lub bezpośrednio z json.dump(), a następnie upewnij się, że powstały ciąg zostanie zapisany na dysku. Jeśli wywołasz open('data.json', 'w'), otrzymujesz uchwyt pliku w trybie zapisu, który albo tworzy plik, albo go obcina, jeśli już istnieje.

W przypadku struktur zagnieżdżonych protokół niczym nie różni się od protokołu dla danych płaskich: nadal używasz tego samego json.dump() Wywołanie, a zagnieżdżone kombinacje list i słowników są kodowane rekurencyjnie. Jedyną decyzją, którą zazwyczaj trzeba podjąć, jest to, ile wcięć chcesz dla czytelności, a ile dla rozmiaru pliku.

Odczyt JSON z pliku odbywa się w odwrotnej kolejności: otwieramy plik w trybie tekstowym, przekaż obiekt pliku do json.load(), a otrzymasz swoją strukturę danych w Pythonie. Ponownie, zachowanie jest niezależne od głębokości zagnieżdżenia – dekoder zajmuje się tym wszystkim za Ciebie.

Jeśli chcesz dodać dane JSON do istniejących plików, Sprawa staje się bardziej skomplikowana. Sam JSON nie obsługuje „dołączania strumieniowego” w trywialny sposób, ponieważ cały plik musi być poprawnym JSON-em. Typowym wzorcem jest przechowywanie tablicy rekordów i odczytywanie/modyfikowanie/zapisywanie całej tablicy lub używanie JSON-a rozdzielonego wierszami, gdzie każdy wiersz jest oddzielnym obiektem JSON, do którego można dołączać dane bez przepisywania poprzednich wierszy.

JSON w świecie rzeczywistym: interfejsy API, przechowywanie i wymiana

Gdy zaczniesz tworzyć prawdziwe aplikacje, JSON szybko stanie się spoiwem Łączy on klientów i serwery internetowe, mikrousługi oraz interfejsy API innych firm. Jest ceniony zarówno ze względu na swoją kompaktowość, jak i łatwość odczytu i edycji.

W interakcji z API JSON jest zdecydowanie najpopularniejszym formatem danych, szczególnie w usługach RESTful. Aplikacje Pythona zazwyczaj korzystają z bibliotek takich jak requests do wysyłania żądań HTTP i odbieraj odpowiedzi JSON, a następnie przeanalizuj te odpowiedzi za pomocą json.loads() lub za pomocą metod pomocniczych, które go opakowują.

JSON jest również popularnym formatem plików konfiguracyjnych i dzienników, gdzie jego ustrukturyzowana, oparta na wartościach kluczach natura sprawia, że ​​jest on znacznie bardziej ekspresyjny niż zwykły tekst, a jednocześnie pozostaje prosty w porównaniu z pełnymi bazami danych. Komponenty systemu mogą udostępniać konfigurację za pośrednictwem JSON, a agregatory logów mogą analizować logi JSON, aby łatwiej je filtrować lub analizować.

Innym ważnym przypadkiem użycia jest serializacja i deserializacja struktur danych, Konwersja kolekcji w pamięci do ciągów JSON (serializacja), a następnie ich późniejsza rekonstrukcja (deserializacja). W ten sposób przechowujesz preferencje użytkownika, przesyłać ustrukturyzowane wiadomości poprzez kolejki lub przesyłać zagnieżdżone obiekty przez granice usług, pod warunkiem, że będziesz stosować typy zgodne ze standardem JSON lub udostępnisz niestandardowe kodery.

Oprócz samego JSON, kod Pythona często wymaga konwersji między JSON a innymi formatami, takie jak XML, CSV lub zwykły tekst. Na przykład możesz odczytać plik CSV ze starszego systemu, przekształcić go w listę słowników, a następnie zapisać jako JSON dla nowoczesnego API. Możesz też pobrać JSON z API, znormalizować go i zapisać w formacie CSV, aby analitycy mogli go załadować do arkuszy kalkulacyjnych.

Formatowanie, walidacja i dodatkowe operacje w JSON

Gdy już opanujesz podstawy czytania i pisania, Istnieje wiele drobnych, ale przydatnych operacji, które możesz wykonać na danych JSON, aby usprawnić swój przepływ pracy: formatowanie w celu zwiększenia czytelności, spłaszczanie zagnieżdżonych struktur, sprawdzanie, czy ciąg znaków jest rzeczywiście JSON, oraz sortowanie danych w celu zapewnienia spójności porównań.

Ładne drukowanie z json.dumps(..., indent=...) to pierwszy krok, Zapewniając uporządkowane hierarchie, które ułatwiają szybkie wykrycie problemów strukturalnych. Jest to szczególnie przydatne podczas debugowania lub udostępniania przykładów w dokumentacji.

Spłaszczanie zagnieżdżonego JSON-a może ułatwić dalsze przetwarzanie i analizę, Szczególnie jeśli musisz przekonwertować dane do formatu tabelarycznego, takiego jak CSV, lub przesłać je do narzędzi, które oczekują par klucz-wartość, a nie głęboko zagnieżdżonych obiektów. Zazwyczaj spłaszczanie implementuje się samodzielnie, używając rekurencji lub iteracyjnego przechodzenia po słownikach i listach.

Sprawdzanie poprawności JSON-a często sprowadza się do próby jego analizy i wychwytywania wyjątków, zwłaszcza jeśli po prostu weryfikujesz poprawność składniową ciągu. Do bardziej rygorystycznych kontroli możesz użyć schematu JSON i bibliotek zewnętrznych, ale w wielu przypadkach wystarczy proste try/except na około json.loads() wystarczy.

Sortowanie danych JSON według określonych wartości lub kluczy może być pomocne przy porównywaniu odpowiedzi, Generowanie stabilnych migawek do testów lub po prostu upewnianie się, że podobne obiekty są grupowane razem. Możesz posortować listy i słowniki Pythona przed zrzuceniem lub polegać na sort_keys=True gdy nacisk położony jest na kolejność kluczy w obiektach.

Obsługa błędów podczas pracy z JSON

Nawet dobrze ustrukturyzowane systemy mogą napotkać nieprawidłowo sformatowany plik JSON lub nieoczekiwane dane, Dlatego solidna obsługa błędów w parsowaniu i kodowaniu JSON jest kluczowa. Python wyraża te problemy za pomocą wyjątków, a idiomatycznym sposobem radzenia sobie z nimi jest opakowanie operacji w try...except Bloki.

Podczas dekodowania JSON najczęstszym problemem jest nieprawidłowa składnia, takie jak brakujące cudzysłowy wokół nazw nieruchomości lub przecinki na końcu. json moduł spowoduje błąd dekodowania (zwykle json.JSONDecodeError), które można przechwycić i zarejestrować lub przekonwertować na przyjazne użytkownikowi wiadomości.

Na przykład próba analizy uszkodzonego ciągu znaków może skutkować błędem takim jak: Failed to decode JSON: Expecting property name enclosed in double quotes: line 1 column 29 (char 28)Tego rodzaju komunikat nie tylko informuje o tym, że analiza składniowa się nie powiodła, ale także informuje, w którym miejscu danych wejściowych analizator składniowy się pomylił.

Po stronie kodowania możesz nacisnąć TypeError podczas próby serializacji nieobsługiwanych typów, or ValueError jeśli nie zezwolisz NaN i nieskończoności poprzez allow_nan=False ale Twoje dane zawierają takie wartości. Odwołania cykliczne w kontenerach również mogą powodować RecursionError jeśli wyłączysz sprawdzanie cykliczne.

Najlepszą praktyką jest traktowanie operacji JSON jako zawodnego wejścia/wyjścia, zwłaszcza podczas odczytu ze źródeł sieciowych lub plików zewnętrznych: zawsze zakładaj, że coś może pójść nie tak i odpowiednio wychwytuj wyjątki, ewentualnie dodając warstwy walidacji, aby wymusić bardziej szczegółowe ograniczenia dotyczące danych. json.loads() lub metod pomocniczych API w try...except bloki chronią resztę kodu przed kaskadowymi awariami i umożliwiają powrót przyjazne dla użytkownika błędy JSON klientom, gdy jest to właściwe.

Korzystanie z JSON z interfejsami API sieci Web w Pythonie

Większość interfejsów API sieciowych, z którymi komunikujesz się z poziomu Pythona, będzie wysyłać i odbierać JSON, a typowy stos programistyczny łączy w sobie requests biblioteka (dla HTTP) z json Moduł (do parsowania i generowania JSON). To połączenie sprawia, że ​​integracja API jest bardzo naturalna.

Typowym wzorcem jest wywoływanie punktu końcowego API, sprawdź, czy kod statusu odpowiedzi wskazuje na powodzenie, a następnie analizować treść JSONStąd możesz uzyskać dostęp do pól, obsługiwać zagnieżdżone dane i mapować odpowiedzi na własne modele domenowe lub przeglądać obiekty.

Obsługa błędów staje się szczególnie ważna, gdy występują wywołania sieciowe, ponieważ możesz natknąć się nie tylko na nieprawidłowy kod JSON, ale także na przekroczenie limitu czasu, błędy połączenia lub awarie po stronie serwera, które odpowiadają kodem HTML zamiast JSON. json.loads() lub metod pomocniczych API w try...except bloki chronią resztę kodu przed kaskadowymi awariami.

Po przeanalizowaniu API JSON zachowuje się tak samo jak każda inna struktura danych Pythona, Wszystkie omówione wcześniej techniki – ładne drukowanie, spłaszczanie, walidacja, sortowanie – mają zastosowanie bezpośrednio. Swobodne poruszanie się między danymi Pythona a JSON-em to ogromny wzrost produktywności podczas łączenia usług. Jeśli skupiasz się na… budowanie prawdziwych aplikacjizwrócenie uwagi na wzorce obsługi JSON na wczesnym etapie pozwoli zaoszczędzić czas poświęcany na debugowanie później.

JSON w Pythonie to nie tyle pojedyncze wywołanie funkcji, co raczej zestaw narzędzi: przejrzyste mapowanie typów, elastyczne parametry kodowania, haki dla niestandardowych typów, proste, ale wydajne wejście/wyjście plików oraz solidne wzorce do parsowania, formatowania i walidacji danych ze świata zewnętrznego — wszystko to sprawia, że ​​JSON jest naturalnym wyborem dla programistów Pythona zajmujących się nowoczesnymi aplikacjami opartymi na danych.

Podobne artykuł:
Rozwiązany: pobierz dane strony internetowej jako json python
Powiązane posty: