JSON | |
---|---|
Udvidelse | .json[en] |
MIME -type | application/json [2] |
Formattype | Dataudveksling |
Udvidet fra | JavaScript |
Standard(er) | RFC 8259 |
Internet side | json.org _ |
Mediefiler på Wikimedia Commons |
JSON ( engelsk JavaScript Object Notation , normalt udtales som / ˈ dʒ eɪ s ən / JAY-sən [3] ) er et tekstbaseret dataudvekslingsformat baseret på JavaScript . Som mange andre tekstformater er JSON let for mennesker at læse. JSON-formatet blev udviklet af Douglas Crockford [4] .
På trods af at det er afledt af JavaScript (mere præcist, et sprogundersæt af 1999 ECMA-262- standarden ), betragtes formatet som sproguafhængigt og kan bruges med næsten ethvert programmeringssprog . For mange sprog er der færdiglavet kode til oprettelse og behandling af data i JSON-format.
På grund af dets kortfattethed sammenlignet med XML , kan JSON-formatet være mere velegnet til at serialisere komplekse strukturer. Det bruges i webapplikationer både til dataudveksling mellem browseren og serveren ( AJAX ) og mellem servere (programmatiske HTTP - parringer).
Da JSON-formatet er en delmængde af JavaScript-sprogsyntaksen, kan det hurtigt deserialiseres med JSON.parse().
JSON-tekst er (kodet) en af to strukturer:
Datastrukturerne, der bruges af JSON, understøttes af ethvert moderne programmeringssprog, hvilket gør det muligt at bruge JSON til at udveksle data mellem forskellige programmeringssprog og softwaresystemer.
Følgende kan bruges som værdier i JSON:
En streng ligner meget en literal af samme datatype i JavaScript . Et tal minder også meget om et JavaScript-nummer, bortset fra at det kun bruger decimalformat (med en prik som separator). Mellemrum kan indsættes mellem to vilkårlige syntakselementer.
Følgende eksempel viser en JSON-repræsentation af data om et objekt, der beskriver en person. Dataene indeholder for- og efternavnsstrengfelter , adresseoplysninger og et array, der indeholder en liste over telefonnumre. Som du kan se fra eksemplet, kan værdien være en indlejret struktur.
{ "firstName" : "Ivan" , "lastName" : "Ivanov" , "address" : { "streetAddress" : "Moskovskoe sh., 101, kv.101" , "city" : "Leningrad" , "postalCode" : 101101 }, "phoneNumbers" : [ "812 123-1234" , "916 123-4567" ] }Både tal og strenge kan bruges som værdier i JSON. Derfor indeholder posten "postalCode": "101101"en streng, og "postalCode": 101101 - allerede en numerisk værdi. På grund af svag indtastning i JavaScript og PHP kan en streng castes til et tal og ikke påvirke programlogikken. Det anbefales dog, at du håndterer værditypen forsigtigt, da JSON bruges til udveksling på tværs af systemer.
I XML ville en sådan struktur se sådan ud:
<person> <firstName> Ivan </firstName> <lastName> Ivanov </lastName> <address> <streetAddress> Moskovskoye sh., 101, kv.101 </streetAddress> <city> Leningrad </city> <postalCode> 101101 </postalCode> </address> <phoneNumbers> <phoneNumber> 812 123-1234 </phoneNumber> <phoneNumber> 916 123-4567 </phoneNumber> </phoneNumbers> </person>eller sådan her:
<person firstName= "Ivan" efternavn= "Ivanov" > <address streetAddress= "101 Moskovskoye sh., apt. 101" city= "Leningrad" postalCode= "101101" /> <phoneNumbers> <phoneNumber> 812 123-1234 < /phoneNumber> <phoneNumber> 916 123-4567 </phoneNumber> </phoneNumbers> </person>JSON5 er en foreslået udvidelse af json-formatet i overensstemmelse med ECMAScript 5-syntaksen, på grund af det faktum, at json ikke kun bruges til kommunikation mellem programmer, men også oprettes/redigeres manuelt [6] . En JSON5-fil er altid gyldig ECMAScript 5-kode. JSON5 er bagudkompatibel med JSON. For nogle programmeringssprog er der allerede json5-parsere [7] .
Nogle nyskabelser:
Både funktionelt og syntaktisk er JSON en delmængde af YAML- sproget . YAML 1.2-specifikationen angiver især, at "enhver JSON-fil er en gyldig YAML-fil" [8] . Den mest almindelige YAML- parser er også i stand til at håndtere JSON [9] . YAML-specifikationen før 1.2 dækkede ikke fuldt ud JSON, primært på grund af YAML's manglende native UTF-32- understøttelse samt pladskravet efter kommaafgrænseren; desuden inkluderede JSON-specifikationen /* */ stilkommentarer.
Den vigtigste forskel mellem YAML er et sæt syntaksudvidelser, der ikke har noget tilsvarende i JSON:
JSON Schema er et af sprogene til at beskrive strukturen af et JSON-dokument. Bruger JSON-syntaks. Baseret på koncepterne XML Schema , RelaxNG , Kwalify . JSON Schema er et selvbeskrivende sprog: Når det bruges til at behandle data og beskrive dets gyldighed, kan de samme serialiserings- / deserialiseringsværktøjer bruges [10] .
JSON-standarden understøtter ikke objektreferencer , men du kan opnå det ønskede resultat med yderligere konventioner. W3C - anbefalingen for sammenkædede data er JSON-LD , som bruger RDF -datamodellen . I JSON-LD tilføjes en kontekst (kontekst) til dataene, der forbinder egenskaberne for JSON-dokumentobjekter med ontologielementer [11] .
Følgende Javascript-kodeeksempel viser, hvordan en browser kan bruge XMLHttpRequest til at anmode om et JSON-objekt fra serveren (serversiden af programmet er udeladt; den skal indeholde kode, der sender data i JSON-strengformat som svar på anmodninger om url).
var http_request = new XMLHttpRequest (); http_request . onreadystatechange = function () { if ( http_request . readyState !== 4 ) return ; if ( http_request . status !== 200 ) throw new Error ( 'anmodning blev besejret' ); gøre_noget_med_objekt ( JSON . parse ( http_request . responseText )); http_request = null ; }; http_request . åben ( "GET" , url , sand ); http_request . send ( nul );Bemærk at dette XMLHttpRequest- eksempel ikke understøtter Internet Explorer til og med version 6, så der skal bruges lidt anden kode til dem. Mulighederne for at bruge XMLHttpRequest er begrænset på grund af den samme oprindelsespolitik: URL-svaret på anmodningen skal være i det samme DNS-domæne som serveren, der hoster siden, der anmoder om svaret. Alternativt bruges en JSONP- tilgang , som involverer brug af et kodet funktionskald sendt mellem klienten og serveren, så klienten kan indlæse JSON-kodede data fra tredjeparts domæner og underrette den, der ringer om fuldførelsen, selvom dette introducerer en vis sikkerhed risici og yderligere serverkrav.
Alternativt kan du bruge elementer i sidekoden <iframe>til at anmode om JSON-data asynkront eller blot <form action="url_to_cgi_script">. Disse tilgange var fremherskende før udbredt støtte til XMLHttpRequest.
Du kan også bruge dynamiske tags til at videregive JSON-data <script>. Denne metode kan omgå den samme oprindelsespolitik, men den introducerer sårbar kode. JSONRequest er blevet foreslået som et sikrere alternativ .
Selvom JSON er beregnet til at blive serialiseret, ligner dens syntaks JavaScript, og dette skaber en række sikkerhedsproblemer. Ofte anvendes en funktion på data modtaget fra en ekstern kilde i JSON-format eval()uden nogen foreløbig validering.
Da JSON er repræsenteret som et syntaktisk korrekt stykke JavaScript-kode, er den nemmeste måde at parse JSON-data i et JavaScript-program på at bruge den indbyggede JavaScript-funktion eval(), som er designet til at udføre JavaScript-udtryk. Med denne tilgang er der ingen grund til at bruge yderligere parsere.
Brugsteknikken eval()gør systemet sårbart, hvis kilden til de brugte JSON-data ikke er tillid . kode til angreb af Code Injection Ved at bruge denne sårbarhed er det muligt at udføre datatyveri, autentificeringsforfalskning.
En ny funktion er blevet foreslået JSON.parse(), der kun kan behandle JSON-data. Det blev introduceret i den fjerde version af ECMAScript -standarden og beskrevet i artiklen "JSON: Et fedtfrit alternativ til XML" [12] . Det er i øjeblikket tilgængeligt som et JavaScript-bibliotek [13] og er inkluderet i den femte udgave af ECMAScript.
Nyere versioner af webbrowsere har indbygget understøttelse af JSON og er i stand til at behandle det.
Den dårligt gennemtænkte brug af JSON gør websteder sårbare over for forfalskning af anmodninger på tværs af websteder (CSRF eller XSRF) [14] . Da tagget <script>tillader brugen af en kilde, der ikke tilhører det samme domæne som den ressource, der bruger, tillader dette, at kode udføres under dække af JSON-data i sammenhæng med en vilkårlig side, hvilket gør det muligt at kompromittere adgangskoder eller andre følsomme oplysninger om brugere, der er autoriseret på et andet websted.
Dette ser kun ud til at være et problem, hvis JSON-dataene indeholder følsomme oplysninger, der kan kompromitteres af en tredjepart, og hvis serveren er afhængig af -origin-politik for at blokere adgangen til dataene, når den støder på en ekstern anmodning Dette er ikke et problem, hvis serveren bestemmer gyldigheden af anmodningen, og leverer kun data, hvis de er korrekte. En HTTP-cookie kan ikke bruges til at bestemme dette. Den eksklusive brug af en HTTP-cookie udnyttes af forfalskning af anmodninger på tværs af websteder .
JSONP ( JSON Padding ) er en udvidelse af JSON, når navnet på en tilbagekaldsfunktion er angivet som et input-argument.
Teknologien er baseret på, at browserens sikkerhedspolitik ikke forbyder brugen af tagget <script type="text/javascript" src="…"></script>til at få adgang til andre servere end den server, hvorfra siden blev indlæst.
Uden at bruge JSONP-teknologi (det vil sige kun at bruge JSON-datakodning), kan serveren kun returnere data. For eksempel sådan her:
{ "paper" : "A4" , "count" : 5 }Dette er dog kun data og kan ikke påvirke browseren.
Ved at bruge JSONP-teknikken videregives navnet på tilbagekaldsfunktionen til tredjepartsserveren i opkaldsstrengen (GET):
<script type="text/javascript" src="http://example.com/getjson?jsonp=parseResponse"></script>Her indeholder jsonp-parameteren callback-navnet på parseResponse-funktionen.
Nu kan den udenlandske server example.com returnere følgende kode:
parseResponse ({ "paper" : "A4" , "count" : 5 })Nu kalder koden javascript-funktionen på det første domæne.
Ideen blev oprindeligt foreslået på MacPython-bloggen i 2005 [15] og bruges i øjeblikket af mange Web 2.0- applikationer såsom Dojo Toolkit Applications, Google Toolkit Applications [ https://www.webcitation.org/6Djo88laj?url=http: / /www.gwtapps.com/?p=42%5d og zanox Web Services. Yderligere udvidelser til denne protokol er blevet foreslået for at inkludere yderligere argumenter, såsom i tilfældet med JSONPP [16] understøttet af S3DB -webtjenester.
Fordi JSONP bruger script-tags, er opkaldene i det væsentlige åbne for verden. Af denne grund er JSONP muligvis ikke egnet til lagring af følsomme data [17] .
Inkludering af script-tags fra eksterne websteder giver dem mulighed for at videregive ethvert indhold på webstedet. Hvis det eksterne websted har sårbarheder, der tillader Javascript-injektion, kan det oprindelige websted også blive påvirket.
JSONPP ( eng. parameteriseret JSON med polstring - "parameteriseret JSON med polstring") - udviklingen af JSONP-ideen.
JSONPP inkluderer kilde-URL'en, navnet på den funktion, der skal behandle JSON-dataene, strengen, der skal evalueres, efter at dataene er modtaget, og strengen, der skal evalueres, når dataene er færdige:
JSON_call ( SRC , JSONP , JSONPP , ONLOAD );vender til sidst om
ans = JSONP ( SRC ) { eval ( JSONPP ( ans )); eval ( ONLOAD ); }Generelt er antallet af parametre ikke vigtigt for selve JSONPP-ideen. SRC, JSONP, JSONPP (og deres behandling på serversiden og derefter klientsiden) er nok til at det er JSONPP.
Overvej eksemplet med at arbejde med S3DB-tjenesten.
funktion s3db_jsonpp_call ( src , next_eval ){ var call = "call_" + Math . tilfældig (). toString (). erstatte ( /\./g , "" ); var headID = dokument . getElementsByTagName ( "hoved" )[ 0 ]; var script = dokument . createElement ( 'script' ); script . id = opkald ; script . type = 'tekst/javascript' ; // ved hjælp af polstret, parameteriseret json src = src + "&format=json&jsonp=s3db_jsonpp&jsonpp=" + next_eval + "&onload=remove_element_by_id('" + script . id + "')" ; script . src = src ; hoved-ID . appendChild ( script ); // hente svar } funktion s3db_jsonpp ( ans , jsonpp ) { eval ( jsonpp ); returnere ans ; } funktion remove_element_by_id ( id ){ var e = document . getElementById ( id ); e . parentNode . fjernBarn ( e ); returnere falsk ; }I eksemplet s3db_jsonpp_call()opretter funktionen et script-element i hoveddelen af DOM, hvis src matcher JSONPP-kaldet.
Efter at have modtaget et svar fra serveren vil det blive kaldt s3db_jsonpp() - det videregives i opkaldsparametrene, som det skal være ifølge JSONP regler.
Internt s3db_jsonpp()vil fungere eval(jsonpp), og værdien af ans vil blive returneret.
Kaldning af eval(onload) resulterer i udførelse remove_element_by_id()med id'et for det oprettede script i head og til sidst sletning, fordi det alligevel ikke længere vil blive brugt, da id'et i eksemplet blev tilfældigt genereret helt i begyndelsen af funktionen s3db_jsonpp_call(). Dette opkald er i serverens svar.
JSONB er en binær JSON-udvidelse introduceret til PostgreSQL i version 9.4.18. Faktisk er JSONB en binær repræsentation af JSON [18] , med den forskel at mellemrum fjernes i lagrede strenge, objektsortering bevares ikke, og kun den sidste værdi for duplikerede nøgler gemmes [19] .
Dokumentmarkeringssprog | |
---|---|
kontordokumenter _ | |
Kendt | |
Mindre kendt |
Web og hjemmesider | |
---|---|
globalt | |
Lokalt | |
Typer af websteder og tjenester |
|
Oprettelse og vedligeholdelse | |
Typer af layout, sider, websteder | |
Teknisk | |
Markedsføring | |
Samfund og kultur |