- JSON se jasno preslika v osnovne tipe Pythona, pri čemer so objekti in polja predstavljeni kot slovarji in seznami, kar olajša izmenjavo podatkov.
- Pythonov modul json ponuja prilagodljive funkcije izpisa/nalaganja z možnostmi za lep izpis, prilagojene kodirnike in stabilno vrstni red ključev.
- Branje, pisanje in razčlenjevanje ugnezdenih JSON-ov iz datotek in API-jev se zanaša na ista osnovna orodja, v kombinaciji s skrbnim obravnavanjem napak.
- Poleg osnovne serializacije JSON v Pythonu podpira oblikovanje, validacijo in integracijo z drugimi podatkovnimi formati, kot sta CSV in XML.
JSON je tiho postal privzeti jezik za podatke na spletu, in če pišete Python, nanj naletite povsod: API-ji, konfiguracijske datoteke, majhne »baze podatkov« za stranske projekte, dnevniki in celo testne napeljave. Razumevanje, kako se podatkovni tipi Pythona preslikajo v JSON in kako json Modul, ki resnično deluje, je ena tistih veščin, ki nenadoma poenostavi veliko vsakodnevnih opravil.
Ta vodnik vas vodi skozi JSON z vidika programerja v Pythonu, razlaga, kaj je JSON, kako je povezan z JavaScriptom, katere tipe Pythona lahko predstavlja in kako razčleniti, generirati, lepo izpisati, preveriti in prilagoditi JSON z uporabo jsonOgledali si bomo tudi primere uporabe iz resničnega sveta, kot je delo z datotekami in API-ji, ter trike za ravnanje z ugnezdenimi podatki in robne primere, kot so napake ali posebne vrednosti, kot so ... NaN in neskončnosti.
Kaj je JSON in kako je povezan s podatki v Pythonu
JSON, okrajšava za JavaScript Object Notation (notacija objektov JavaScript), je besedilna oblika za strukturirane podatke , ki si je sintakso prvotno sposodila od objektov in polj JavaScript. Kljub koreninam JavaScript je JSON jezikovno agnostičen in ga podpira praktično vsak sodobni jezik, vključno s Pythonom, zaradi česar je idealen za izmenjavo podatkov med storitvami, odjemalci in strežniki.
Konceptualno JSON uporablja le dva sestavljena gradnika: objekt JavaScript in polje JavaScript . Objekt se obnaša zelo podobno slovarju Python, polje pa se obnaša kot seznam Python. S tema dvema elementoma in majhnim naborom primitivnih tipov lahko JSON opiše kompleksne vgnezdene podatkovne strukture.
Objekt v JavaScriptu (in JSON-u) izgleda takole: {"key1": value1, "key2": value2}Gre za zbirko parov ključ-vrednost, kjer so ključi nizi, vrednosti pa so lahko poljubne veljavne vrednosti JSON (vključno z drugimi objekti ali nizi). To zelo ustreza Pythonu. dict.
Matrika v JavaScriptu (in JSON-u) je podobna seznamu v Pythonu: Gre za urejeno zbirko vrednosti, ki spet uporablja kateri koli veljaven tip JSON. Objekte in polja je mogoče poljubno gnezditi skupaj za modeliranje bogatih podatkov, kot so uporabniški profili, konfiguracijska drevesa ali odzivi API-ja.
Preslikava med tipi JSON in tipi Python je zelo preprosta, zato včasih slišimo ljudi, ki se šalijo, da to imenujejo »PYON« (Python Object Notation). Ko Python kodira ali dekodira JSON, veljajo naslednje korespondence:
- Objekt JSON → Python
dict - JSON matrika → Python
list - JSON niz → Python
str - Številka JSON (celo število) → Python
int - Številka JSON (realna) → Python
float - JSON
true→ PythonTrue - JSON
false→ PythonFalse - JSON
null→ PythonNone
Pomembna omejitev je, da so ključi objektov JSON vedno nizi, torej, če kodirate Python dict Pri ključih, ki niso nizi (npr. cela števila ali nabori), bodo ti ključi prisiljeni v nize ali pa bodo povzročili napake, odvisno od vaših nastavitev. JSON je odličen za shranjevanje strukturiranih podatkov, kot so konfiguracije ali zapisi, vendar je ne splošen mehanizem za vlaganje poljubnih objektov Pythona.

Vgrajeni modul JSON v Pythonu
Python je dobavljen s standardnim knjižničnim modulom, imenovanim json, ki vam ponuja vse, kar potrebujete za delo z JSON: razčlenjevanje nizov, nalaganje iz datotek, serializacijo objektov Python in prilagajanje načina kodiranja in dekodiranja podatkov. Za tipična opravila JSON ne potrebujete nobene zunanje odvisnosti.
Štiri osnovne funkcije, ki jih boste uporabljali večino časa, so: json.dumps() in json.dump() za pretvorbo objektov Python v JSON in json.loads() in json.load() za prehod iz JSON nazaj na tipe Python. Različice »s« delujejo z nizi, različice brez »s« pa z datotekami podobnimi objekti.
Naš json kodirnik privzeto podpira določen nabor tipov Pythona, in sicer dict, list, tuple (kot polja), str, številke (int, floatin naštevanja, izpeljana iz celih/float števil), ter trije posebni singletoni True, Falsein NoneTi se pretvorijo v njihove ekvivalente JSON v skladu s prej opisanim preslikavanjem.
Če morate serializirati objekte ali podatkovne tipe po meri, Zasnova modula je razširljiva: kodirnik JSON lahko podrazvrstite in implementirate default() metodo ali pa posredujte metodo po meri default funkcijo v json.dump() / json.dumps()Ta kavelj po meri bi moral vrniti nekaj, kar je mogoče serializirati v JSON (kot dict or list) ali zvišati TypeError če ne ve, kako ravnati z danim objektom.
Pod pokrovom modul ponuja tudi metode, kot so encode() in iterencode(), ki pretvorijo podatke Pythona v nize JSON, z iterencode() inkrementalno pridobivanje kodiranih delov. Te se manj pogosto uporabljajo neposredno, vendar jih je vredno poznati, če morate pretakati zelo velike JSON odgovore.
Pretvarjanje objektov Python v JSON
Ko želite podatke Pythona pretvoriti v besedilo JSON, uporabite json.dump() or json.dumps(), odvisno od tega, ali želite pisati neposredno v datoteko ali dobiti niz JSON v pomnilniku. Obe funkciji imata iste osnovne parametre, ki vam omogočajo nadzor nad delovanjem pretvorbe.
funkcija json.dump(obj, fp, ...) sprejme objekt Python in objekt, podoben datoteki, in zapiše JSON predstavitev obj v to datoteko. Njen pomnilniški dvojnik, json.dumps(obj, ...), namesto zapisovanja v datoteko vrne niz JSON. Oba sprejemata vrsto ključnih argumentov, kot je skipkeys, ensure_ascii, check_circular, allow_nan, indent, separators, defaultin sort_keys.
Vsaka od teh možnosti prilagodi vedenje kodiranja na načine, ki so v resničnih projektih zelo pomembni: izberete lahko, ali želite preskočiti neveljavne ključe, vsiliti izpis ASCII, lepo izpisati rezultat, nadzorovati presledke, definirati serializacijo po meri za nestandardne objekte ali stabilizirati vrstni red ključev za testiranje in razlike.
Tukaj je tisto, kar glavni parametri pomenijo v praksi:
skipkeys: če je nastavljeno naTrue, ključi slovarja, ki niso tipastr,int,float,boolorNonese tiho preskočijo namesto da bi se dvigniliTypeErrorČe želite, da se delovanje ob nenavadnih tipkah obnaša hitro, pustite to tako.False.ensure_ascii: kdajTrue(privzeto) se ubežijo znaki, ki niso ASCII in znaki, ki jih ni mogoče natisniti (npr. kot\uXXXX), tako da izhod ostane čisti ASCII. KoFalseZnaki Unicode so zapisani takšni, kot so, kar je običajno boljše za človeku berljive konfiguracije ali dnevnike.check_circular: ifTrue, kodirnik preveri krožne reference v seznamih, slovarjih in po meri kodiranih objektih, da prepreči neskončno rekurzijo. Če ga nastavite naFalseonemogoči to varnostno mrežo in lahko privede doRecursionErrorče so vaše strukture samoreferenčne.allow_nan: ifTrue, posebne vrednosti s plavajočo vejico, kot soNaN,Infinityin-Infinityso dovoljene in kodirane na način, združljiv z JavaScriptom, čeprav po specifikaciji niso strogo veljavni JSON. ČeFalse, poskus kodiranja takšnih vrednosti bo povečalValueError.indent: nenegativno celo število (ali niz), ki nadzoruje lep izpis. Pozitivno število pomeni, da je na vgnezdeno raven toliko presledkov. Niz (kot je"\t") se uporablja neposredno za zamik.None(privzeto) izbere najkompaktnejšo predstavitev, brez dodatnih novih vrstic, razen tistega, kar je potrebno.separators: nabor(item_separator, key_separator)nadzor ločil in presledkov med elementi ter med ključi in vrednostmi. Za najtesnejši JSON običajno uporabite(",", ":")da odstranite vse neobvezne presledke.default: funkcija, ki prejme kateri koli objekt, ki ga kodirnik ne zna obdelati. Vrniti mora serializirajočo se JSON zamenjavo (kot jedictorlist) ali zvišatiTypeErrorTo je glavni kavelj za izdelavo lastnih razredov, ki jih je mogoče serializirati.sort_keys: ifTrue, slovarji so kodirani z razvrščenimi ključi. To je izjemno priročno za regresijske teste in ponovljive izhode, kjer želite, da so izpisi JSON stabilni med zagoni.
Kot konkreten primer si predstavljajte, da imate mešan seznam v Pythonu, ki vsebuje cela števila in slovar z imenom, ID-jem in številom v plavajoči vejici. JSON lahko ustvarite in shranite takole:
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))
Natisnjen JSON bo lepo oblikovan zaradi indent=4, prikaz vsakega elementa seznama in ključa slovarja v svoji vrstici. To precej olajša odpravljanje napak in ročno urejanje v primerjavi z eno samo, gosto vrstico besedila.
Razčlenjevanje JSON nazaj v Python
Če želite preiti iz besedila JSON nazaj v objekte Python, Uporabite ujemajoči se par funkcij: json.load() (za objekte, podobne datotekam) in json.loads() (za nize JSON). Te funkcije razčlenijo vhod in ponovno ustvarijo tipe Pythona v skladu z isto tabelo preslikav kot prej.
Podpisi izgledajo približno takole: json.load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, kw) in json.loads(s, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, kw)Na osnovni ravni jih lahko pokličete samo z vhodom JSON, vendar dodatni argumenti odpirajo vrata naprednejšemu vedenju razčlenjevanja.
Kavlji kot object_hook in object_pairs_hook omogočajo vam prilagoditev načina pretvorbe objektov JSON v strukture Pythona, tako, da vam posredujemo bodisi dekodirano dict ali seznam (key, value) parov. To je uporabno, če želite zgraditi razrede po meri neposredno iz JSON-a ali ohraniti vrstni red na določen način.
Drugi klicni elementi, kot so parse_float, parse_intin parse_constant omogočajo vam nadzor nad razlago številk in posebnih žetonov. Na primer, morda boste želeli uporabiti Decimal Namesto float za denarne vrednosti ali preoblikovanje "NaN", "inf"in "-inf" v varovalne objekte po vaši izbiri.
Če nadaljujemo s prejšnjim primerom, lahko datoteko JSON, ki ste jo napisali, preberete takole:
with path.open(mode="rt") as f:
data = json.load(f)
print(data)
Rezultat bo navaden seznam in slovar v Pythonu, na primer , ki jih lahko upravljate z vsemi običajnimi operacijami v Pythonu. Z vidika vaše kode so to spet »samo podatki«.
Katere tipe lahko Python pretvori v JSON
Vsakega Python objekta ni mogoče takoj pretvoriti v JSON. zato si je koristno zapomniti dovoljeni nabor. Praktični kodirniki podpirajo običajne tipe kontejnerjev in skalarjev ter logične vrednosti in Nonein jih preslikajte v minimalni nabor tipov JSON.
Privzeto lahko varno posredujete naslednje objekte Pythona v json.dumps():
dict(kodirano kot objekti JSON)listintuple(kodirano kot JSON polja)str(kodirano kot nizi JSON)intinfloat(kodirano kot številke JSON)TrueinFalse(kodirano kottrueinfalse)None(kodirano kotnull)
Ko Python te kode kodira, je preslikava nazaj v JSON preprosta, in obratno pri dekodiranju. Na primer, Python tuple postane JSON niz in dobite list nazaj ob nalaganju. Naštevanja, izpeljana iz int or float lahko kodirajo tudi kot številke.
Vse ostalo zahteva prilagoditev default vodnik (za pretvorbo objektov v serializirano predstavitev) ali bo povzročilo TypeErrorTo je zasnovano tako: JSON je namenjen podatkom, ne pa poljubnim grafom objektov z vedenjem in metodami, kot bi jih morda serializirali z uporabo pickle.
Za večino vsakodnevnega dela ta podmnožica tipov pokriva večino primerov uporabe, vključno s koristnimi podatki API-ja, konfiguracijskimi drevesi, uporabniškimi nastavitvami, osnovnimi dnevniki in majhnimi datotekami, podobnimi bazam podatkov, za prototipe ali orodja za enega uporabnika.
Lep tisk, kompakten izpis in urejene tipke
Surov izhod JSON je običajno popolnoma veljaven, vendar ga je težko brati, saj je pogosto ustvarjen brez nepotrebnih presledkov. Za odpravljanje napak, beleženje ali deljenje z drugimi razvijalci pogosto potrebujete berljiv, zamaknjen JSON namesto enovrstičnega.
Naš indent parameter json.dumps() je glavna vzvod za lep tisk, kar vam omogoča, da Pythonu poveste, koliko presledkov (ali kateri niz) naj uporabi na raven zamika. Tipična izbira je indent=4, čeprav nekatere kodne baze dajejo prednost dvema presledkoma ali tabulatorjema; slogovne konvencije se med projekti razlikujejo.
Naš separators argument vam omogoča še bolj natančno nastavitev presledkov, dajanje naborka, kot je (", ", ": ") privzeto za človeku prijazen izpis. Če želite čim bolj kompaktno predstavitev – na primer za zmanjšanje velikosti koristnega tovora v omrežju – lahko nastavite separators=(",", ":") za odstranitev presledkov za vejicami in dvopičji.
Ko vas zanima deterministični izhod, na primer pri enotnih testih ali primerjavah posnetkov, aktiviranje sort_keys=True naredi ključe slovarja kodirnika razvrščene po vrstnem redu. Na ta način se dva zagona, ki ustvarita semantično enake podatke, ne razlikujeta samo zato, ker slovarji slučajno oddajo ključe v različnem zaporedju.
Skupaj, indent, separatorsin sort_keys vam dajo veliko nadzora glede tega, ali je vaš JSON optimiziran za stroje (kompakten, brez presledkov) ali za ljudi (zamaknjen, poravnan, s stabilno obliko med ponovitvami).
Vgnezdeni podatki, strategije razčlenjevanja in vzorci dostopa
V resničnem JSON-u so ploske strukture izjema; običajno boste imeli opravka z ugnezdenimi objekti in polji. Pomislite na tipičen uporabniški zapis v aplikaciji za e-trgovino: osebni podatki, ugnezdeni naslovi za dostavo, ugnezdeni podatki za obračun in morda seznam naročil, od katerih je vsako samo po sebi kompleksna struktura.
Pri dekodiranju JSON-a v Python se ugnezdeni podatki spremenijo v kombinacije slovarjev in seznamov, in do njega lahko dostopate s standardnim indeksnim in ključnim iskanjem. Za plitve strukture je to preprosto: data, data, in tako naprej.
Za globoko vgnezdene ali dinamične strukture boste morda raje uporabili bolj splošen pristop, kot je pisanje majhne rekurzivne funkcije, ki išče ključe ali se sprehaja po drevesu slovarjev in seznamov. Rekurzivne rešitve so pri prečevanju poljubno vgnezdenih podatkov pogosto krajše in lažje berljive kot iterativne.
Do negnezdenega (ravnega) JSON-a je lažje dostopati neposredno s trdo kodiranimi ključi, kar je lahko povsem v redu za majhne pripomočke ali ko v celoti nadzorujete vhod. Pri uporabi zunanjih API-jev pa je običajno napisati majhne pomožne funkcije, ki zajamejo strukturo, tako da je ni treba razpršiti. verige po vsej vaši kodni bazi.
Ne glede na globino, enako json.loads() vedenje velja: Funkcija sprejme niz JSON in ustvari izvorne tipe Pythona, ki jih nato upravljate z običajnimi orodji Pythona. Ni potrebna nobena posebna sintaksa, razen običajne. dict in list indeksiranje.
Delo z datotekami JSON: branje, pisanje in dodajanje
JSON je presenetljivo priročen in lahek format za shranjevanje majhnih projektov, konfiguracijskih datotek ali skriptov, ki morajo ohranjati neko trajno stanje. Namesto da bi segali neposredno po celotni bazi podatkov, se pogosto lahko kar nekaj časa znajdete z eno ali dvema datotekama JSON.
Pisanje JSON v datoteko je običajno dvostopenjski postopek: serializirajte podatke v Pythonu z json.dumps() ali neposredno z json.dump()in nato zagotovite, da se nastali niz zapiše na disk. Če pokličete open('data.json', 'w'), v načinu pisanja dobite ročaj datoteke, ki bodisi ustvari datoteko bodisi jo skrajša, če že obstaja.
Za vgnezdene strukture se protokol ne razlikuje od ploskih podatkov: še vedno uporabljaš isto json.dump() klic, ugnezdene kombinacije seznamov in slovarjev pa so rekurzivno kodirane. Edina odločitev, ki jo morate običajno sprejeti, je, koliko zamika želite za berljivost v primerjavi z velikostjo datoteke.
Branje JSON iz datoteke je obratno: odpiranje datoteke v besedilnem načinu, posredovati objekt datoteke json.load()in dobite nazaj svojo podatkovno strukturo Pythona. Obnašanje je spet neodvisno od tega, kako globoko je gnezdenje – dekoder to uredi namesto vas.
Če morate obstoječim datotekam dodati podatke JSON, postanejo stvari bolj zapletene. JSON sam po sebi ne podpira »pretakanja dodajanja« na preprost način, ker mora biti celotna datoteka veljaven JSON. Pogost vzorec je shranjevanje polja zapisov in branje/spreminjanje/pisanje celotnega polja ali uporaba JSON, ločenega z vrsticami, kjer je vsaka vrstica ločen objekt JSON, ki mu lahko dodajate podatke, ne da bi prepisali prejšnje vrstice.
JSON v resničnem svetu: API-ji, shranjevanje in izmenjava
Ko začnete graditi prave aplikacije, JSON hitro postane vezivo , ki povezuje spletne odjemalce in strežnike, mikrostoritve in API-je tretjih oseb. Cenjen je tako zaradi svoje kompaktnosti kot tudi zato, ker ga ljudje še vedno lahko berejo in urejajo dokaj enostavno.
Pri interakciji z API-ji je JSON daleč najpogostejši format koristnega tovora, zlasti v storitvah RESTful. Aplikacije v Pythonu običajno uporabljajo knjižnice, kot so requests za pošiljanje HTTP zahtev in prejemanje odgovorov JSON, nato pa te odgovore razčlenite z json.loads() ali s pomožnimi metodami, ki ga ovijejo.
JSON je priljubljena oblika tudi za konfiguracijske datoteke in dnevnike, kjer je zaradi strukturirane narave ključ-vrednost veliko bolj izrazit kot navadno besedilo, hkrati pa ostaja preprost v primerjavi s polnimi bazami podatkov. Sistemske komponente lahko delijo konfiguracijo prek JSON-a, agregatorji dnevnikov pa lahko razčlenijo dnevnike JSON, da jih lažje filtrirajo ali analizirajo.
Drug pomemben primer uporabe je serializacija in deserializacija podatkovnih struktur, pretvorba zbirk v pomnilniku v nize JSON (serializacija) in njihova kasnejša rekonstrukcija (deserializacija). Tako shranjujete uporabniške nastavitve, prenašate strukturirana sporočila prek čakalnih vrst ali pošiljate ugnezdene objekte prek meja storitev, če se držite tipov, združljivih z JSON, ali zagotovite kodirnike po meri.
Poleg samega JSON-a mora koda Python pogosto pretvarjati med JSON-om in drugimi oblikami zapisa, kot so XML, CSV ali navadno besedilo. Na primer, lahko preberete CSV iz starejšega sistema, ga pretvorite v seznam slovarjev in ga nato izpišete kot JSON za sodoben API. Lahko pa JSON poberete iz API-ja, ga normalizirate in napišete CSV, ki ga bodo analitiki naložili v preglednice.
Oblikovanje, validacija in dodatne operacije v JSON-u
Ko se enkrat navadite na osnovno branje in pisanje, lahko s podatki JSON izvedete kup majhnih, a uporabnih operacij, s katerimi izboljšate svoj potek dela: oblikovanje za berljivost, sploščitev ugnezdenih struktur, preverjanje, ali je niz res JSON, in razvrščanje podatkov za dosledne primerjave.
Lep tisk z json.dumps(..., indent=...) je prvi korak, kar vam omogoča lepo razporejene hierarhije, ki olajšajo hitro odkrivanje strukturnih težav. To je še posebej koristno med odpravljanjem napak ali pri deljenju primerov v dokumentaciji.
Sploščitev ugnezdenih JSON-ov lahko olajša nadaljnjo obdelavo in analizo, zlasti če morate podatke pretvoriti v tabelarično obliko, kot je CSV, ali jih vnesti v orodja, ki pričakujejo pare ključ-vrednost namesto globoko ugnezdenih objektov. Sploščitev običajno implementirate sami z rekurzijo ali iterativnim prečkanjem slovarjev in seznamov.
Preverjanje JSON-a se pogosto zreducira na poskus njegovega razčlenjevanja in lovljenja izjem, še posebej, če samo preverjate, ali je niz sintaktično pravilen. Za natančnejša preverjanja lahko uporabite JSON Schema in zunanje knjižnice, vendar je v mnogih primerih dovolj preprost try/except okoli json.loads() Je dovolj.
Razvrščanje podatkov JSON po določenih vrednostih ali ključih lahko pomaga pri primerjavi odgovorov, ustvarjanje stabilnih posnetkov za teste ali preprosto zagotavljanje, da so podobni objekti združeni. Pred izpisom lahko bodisi razvrstite osnovne sezname in slovarje Pythona bodisi se zanesete na sort_keys=True ko je poudarek na vrstnem redu ključev znotraj objektov.
Obravnavanje napak pri delu z JSON
Tudi dobro strukturirani sistemi lahko naletijo na napačno oblikovan JSON ali nepričakovane podatke, zato je robustno obravnavanje napak pri razčlenjevanju in kodiranju JSON ključnega pomena. Python te težave izraža z izjemami, idiomatični način za njihovo reševanje pa je, da operacije zavijemo v try...except bloki.
Pri dekodiranju JSON-a je najpogostejša težava neveljavna sintaksa, kot so manjkajoči narekovaji okoli imen lastnosti ali končne vejice. json modul bo sprožil napako pri dekodiranju (običajno json.JSONDecodeError), ki jih lahko zajamete in zabeležite ali pretvorite v uporabniku prijazna sporočila.
Na primer, poskus razčlenjevanja pokvarjenega niza lahko povzroči napako, kot je ta: Failed to decode JSON: Expecting property name enclosed in double quotes: line 1 column 29 (char 28)Takšno sporočilo vam pove ne le, da razčlenjevanje ni uspelo, ampak tudi, kje v vhodu je razčlenjevalnik zašel v napako.
Na strani kodiranja lahko naletite TypeError pri poskusu serializacije nepodprtih tipov, or ValueError če ne dovolite NaN in neskončnosti prek allow_nan=False vendar vaši podatki vsebujejo takšne vrednosti. Krožne reference v vsebnikih lahko sprožijo tudi RecursionError če onemogočite krožne preglede.
Najboljša praksa je, da se operacije JSON obravnavajo kot zmotljivi V/I, še posebej pri branju iz omrežnih virov ali zunanjih datotek: vedno predvidite, da bi lahko šlo kaj narobe, in ustrezno prestrezite izjeme, po možnosti dodajte sloje za validacijo, da uveljavite bolj specifične omejitve za svoje podatke. Ovojitev json.loads() ali pomožne metode API-ja v try...except bloki ščitijo preostalo kodo pred kaskadnimi napakami in vam omogočajo vrnitev uporabniku prijazne napake JSON strankam, kadar je to primerno.
Uporaba JSON s spletnimi API-ji v Pythonu
Večina spletnih API-jev, s katerimi se pogovarjate iz Pythona, bo pošiljala in prejemala JSON, in tipičen razvojni sklad združuje requests knjižnica (za HTTP) z json modul (za razčlenjevanje in generiranje JSON-a). Zaradi te kombinacije se integracija API-ja zdi zelo naravna.
Pogost vzorec je klic končne točke API-ja, preverjanje, ali koda stanja odgovora kaže na uspeh, in nato razčlenjevanje telesa JSON . Od tam lahko dostopate do polj, obravnavate ugnezdene podatke in preslikate odgovor v lastne modele domen ali si ogledate objekte.
Obravnavanje napak postane še posebej pomembno, ko so vpleteni omrežni klici ker lahko naletite ne le na neveljaven JSON, temveč tudi na časovne omejitve, napake povezave ali okvare na strani strežnika, ki se odzovejo s HTML namesto z JSON. json.loads() ali pomožne metode API-ja v try...except bloki ščitijo preostalo kodo pred kaskadnimi napakami.
Ko je API JSON razčlenjen, se obnaša tako kot katera koli druga podatkovna struktura Pythona, zato se vse prej omenjene tehnike – lep izpis, sploščitev, validacija, razvrščanje – uporabijo neposredno. Udobno preklapljanje med podatki Pythona in JSON je velik dvig produktivnosti pri povezovanju storitev. Če ste osredotočeni na gradnjo resničnih aplikacij , vam bo zgodnje posvečanje pozornosti vzorcem ravnanja z JSON prihranilo čas pri odpravljanju napak pozneje.
JSON v Pythonu ni toliko klic posamezne funkcije, temveč bolj nabor orodij: jasne preslikave tipov, prilagodljivi parametri kodiranja, kljuke za tipe po meri, preprost, a zmogljiv vhodno/izhodni postopek datotek ter robustni vzorci za razčlenjevanje, oblikovanje in preverjanje podatkov iz zunanjega sveta, zaradi česar je JSON naraven za programerje Pythona, ki se ukvarjajo s sodobnimi aplikacijami, ki temeljijo na podatkih.
