Lestu þetta svona: ysta {} er hlutur með fimm lykla. kennarar er fylki með tveimur strengjum. misseri er hlutur inni í hlut — það kallast hreiðrun (e. nesting) og er algengasta ástæða þess að fólk lendir í vandræðum með JSON.
AðvörunAlgengustu villurnar
JSON er ströng um form:
lyklar verða að vera í tvöföldum gæsalöppum — {'a': 1} er ekki gilt JSON
ekkert komma má vera á eftir síðasta atriði — [1, 2, 3,] er ógilt
true/false eru lágstafa — ekki True/False eins og í Python
Niðurstaðan er dict og þú nálgast hana með hornklofum:
nam["namskeid"]
'IÐN302G'
nam["kennarar"]
['Helga', 'Máni']
nam["misseri"]["ar"]
2026
Ólíkt R, þar sem hreiðraði hlutinn misseri verður listi inni í lista, er hann einfaldlega dict inni í dict — sami hlutur alla leið niður.
Í requests þarftu ekki json.loads() — svar.json() gerir þetta beint.
Athugasemdtrue verður TRUE og True
JSON-gildið true verður TRUE í R og True í Python — bæði mál kortleggja það á sína eigin sannindagerð. Á leiðinni til baka gerist hið gagnstæða, og þess vegna er json.dumps() og toJSON() rétta leiðin frekar en að byggja strenginn sjálf/ur.
Listi af hlutum verður tafla
Þetta er mikilvægasta tilfellið í reynd: þegar API skilar lista af hlutum sem hafa sömu lykla liggur tafla beint við.
nafn eigandi
0 Quarto {'login': 'quarto-dev', 'type': 'Organization'}
1 knitr {'login': 'yihui', 'type': 'User'}
Dálkurinn eigandi ber heila dict-hluti — ónothæft til greiningar. json_normalize() flettir hreiðrunina út:
pd.json_normalize(d["items"])
nafn eigandi.login eigandi.type
0 Quarto quarto-dev Organization
1 knitr yihui User
Dálkarnir eigandi.login og eigandi.type — sama niðurstaða og flatten() skilar í R.
Sé listinn grafinn dýpra má benda á hann beint:
pd.json_normalize(d, record_path="items")
nafn eigandi.login eigandi.type
0 Quarto quarto-dev Organization
1 knitr yihui User
Sama tafla — munurinn er aðeins að þú bendir á items innan úr svarinu í stað þess að taka það út fyrst.
ÁbendingVinnuregla
Ekki reyna að giska á uppbygginguna. Skoðaðu svarið fyrst — str(x, max.level = 2) í R, eða print(json.dumps(d, indent=2, ensure_ascii=False)[:500]) í Python — og flettu svo út.
Stuttu dæmin hér að ofan senda enga hausa — fromJSON(slod) tekur ekki við þeim, og þótt requests.get() styðji headers= er það ekki notað þegar slóðin ein er gefin. Beiðnin fer því óauðkennd af stað.
GitHub leyfir aðeins 60 óauðkenndar beiðnir á klukkustund, svo dæmi sem byggist á þeim er brothætt. Veðurstofan krefst engrar auðkenningar og hentar því betur til að sýna stuttu leiðina.
Þurfirðu auðkenningu — eða yfirleitt að stjórna hausum, stöðukóðum og villum — notarðu httr2 / requests að fullu. Sjá næsta kafla.
ÁbendingRaunveruleg svör eru stór
Langur lyklalisti fyrir eina geymslu er ekkert einsdæmi — þjónustur skila öllu sem þær eiga, ekki því sem þú baðst um. Fyrsta verkið er alltaf að finna út hvað er í boði, og annað verkið að henda öllu hinu.
Þetta er fínt til að skoða, en fyrir alvöru vinnu áttu að nota httr2 / requests með villumeðhöndlun — þau gefa þér stöðukóða og hausa sem stuttu leiðirnar fela. Það er efni næsta kafla.
Hin áttin
Stundum þarftu að senda JSON, t.d. þegar þjónusta krefst POST — eins og Hagstofan gerir.
Íslenski stafurinn skilar sér óbreyttur — jsonlite skrifar UTF-8 sjálfgefið og hefur ekkert viðfang til að slökkva á því. Python hagar sér öfugt; sjá Python-flipann.
AthugasemdHvað auto_unbox gerir
R á enga stærð sem er “ein tala” — 5 er í raun vigur af lengd 1. Án auto_unbox = TRUE skrifar toJSON() því ["Helga"] þar sem þjónustan bjóst við "Helga". Þetta veldur 400 sem er erfitt að rekja, svo hafðu þetta á.
Í httr2 sendirðu listann beint og pakkinn sér um umbreytinguna:
slod <-"https://example.com/api"# slóð sem tekur við JSON með POSTrequest(slod) |>req_body_json(listi, auto_unbox =TRUE) |>req_perform()