JSON | |
---|---|
Förlängning | .json[ett] |
MIME -typ | application/json [2] |
Formattyp | Datautbyte |
Utökad från | JavaScript |
Standard(er) | RFC 8259 |
Hemsida | json.org _ |
Mediafiler på Wikimedia Commons |
JSON ( engelsk JavaScript Object Notation , vanligtvis uttalad som / ˈ dʒ eɪ s ən / JAY-sən [3] ) är ett textbaserat datautbytesformat baserat på JavaScript . Liksom många andra textformat är JSON lätt att läsa för människor. JSON-formatet utvecklades av Douglas Crockford [4] .
Trots att det härstammar från JavaScript (närmare bestämt en språkundergrupp av 1999 ECMA-262- standarden ) anses formatet vara språkoberoende och kan användas med nästan alla programmeringsspråk . För många språk finns färdig kod för att skapa och bearbeta data i JSON-format.
På grund av dess korthet jämfört med XML kan JSON-formatet vara mer lämpligt för att serialisera komplexa strukturer. Den används i webbapplikationer både för datautbyte mellan webbläsaren och servern ( AJAX ), och mellan servrar (programmatiska HTTP -parningar).
Eftersom JSON-formatet är en delmängd av JavaScript-språksyntaxen kan det snabbt deserialiseras med JSON.parse().
JSON-text är (kodad) en av två strukturer:
Datastrukturerna som används av JSON stöds av vilket modernt programmeringsspråk som helst, vilket gör det möjligt att använda JSON för att utbyta data mellan olika programmeringsspråk och mjukvarusystem.
Följande kan användas som värden i JSON:
En sträng är mycket lik en literal av samma datatyp i JavaScript . Ett nummer är också väldigt likt ett JavaScript-nummer, förutom att det bara använder decimalformat (med en punkt som avgränsare). Mellanslag kan infogas mellan två valfria syntaxelement.
Följande exempel visar en JSON-representation av data om ett objekt som beskriver en person. Datan innehåller för- och efternamnssträngfält , adressinformation och en matris som innehåller en lista med telefonnummer. Som du kan se i exemplet kan värdet vara en kapslad 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 siffror och strängar kan användas som värden i JSON. Därför innehåller posten "postalCode": "101101"en sträng och "postalCode": 101101 - redan ett numeriskt värde. På grund av svag skrivning i JavaScript och PHP kan en sträng castas till ett nummer och inte påverka programlogiken. Det rekommenderas dock att du hanterar värdetypen försiktigt, eftersom JSON används för utbyte mellan olika system.
I XML skulle en sådan struktur se ut ungefär så här:
<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å här:
<person firstName= "Ivan" efternamn= "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 är en föreslagen förlängning av json-formatet i enlighet med ECMAScript 5-syntaxen, på grund av det faktum att json inte bara används för kommunikation mellan program, utan även skapas/redigeras manuellt [6] . En JSON5-fil är alltid giltig ECMAScript 5-kod. JSON5 är bakåtkompatibel med JSON. För vissa programmeringsspråk finns det redan json5-parsers [7] .
Några innovationer:
Både funktionellt och syntaktiskt är JSON en delmängd av YAML- språket . Speciellt anger YAML 1.2-specifikationen att "alla JSON-filer är en giltig YAML-fil" [8] . Den vanligaste YAML- parsern kan också hantera JSON [9] . YAML-specifikationen före 1.2 täckte inte helt JSON, främst på grund av YAML:s brist på inbyggt UTF-32- stöd , samt utrymmeskravet efter kommaavgränsaren; dessutom inkluderade JSON-specifikationen /* */ stilkommentarer.
Den viktigaste skillnaden mellan YAML är en uppsättning syntaxtillägg som inte har någon motsvarighet i JSON:
JSON Schema är ett av språken för att beskriva strukturen i ett JSON-dokument. Använder JSON-syntax. Baserat på begreppen XML Schema , RelaxNG , Kwalify . JSON Schema är ett självbeskrivande språk: när det används för att bearbeta data och beskriva dess giltighet, kan samma serialiserings- / deserialiseringsverktyg användas [10] .
JSON-standarden stöder inte objektreferenser , men du kan uppnå önskat resultat med ytterligare konventioner. W3C:s rekommendation för länkad data är JSON-LD , som använder RDF -datamodellen . I JSON-LD läggs ett sammanhang (kontext) till data, som länkar egenskaperna hos JSON-dokumentobjekt med ontologielement [11] .
Följande Javascript-kodexempel visar hur en webbläsare kan använda XMLHttpRequest för att begära ett JSON-objekt från servern (serversidan av programmet utelämnas; den ska innehålla kod som skickar data i JSON-strängformat som svar på förfrågningar 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 ( 'request was defeated' ); do_something_with_object ( JSON . parse ( http_request . responseText )); http_request = null ; }; http_request . open ( "GET" , url , true ); http_request . skicka ( noll );Observera att detta XMLHttpRequest- exempel inte stöder Internet Explorer upp till och med version 6, så lite annan kod måste användas för dem. Möjligheterna att använda XMLHttpRequest är begränsade på grund av samma ursprungspolicy: URL-svaret på begäran måste vara i samma DNS-domän som servern som är värd för sidan som begär svaret. Alternativt används en JSONP- metod , vilket innebär att ett kodat funktionsanrop som skickas mellan klienten och servern används så att klienten kan ladda JSON-kodad data från tredjepartsdomäner och meddela anroparen om slutförandet, även om detta introducerar viss säkerhet risker och ytterligare serverkrav.
Alternativt kan du använda element i sidkoden för <iframe>att begära JSON-data asynkront, eller helt enkelt <form action="url_to_cgi_script">. Dessa tillvägagångssätt var vanliga innan det utbredda stödet för XMLHttpRequest.
Du kan också använda dynamiska taggar för att skicka JSON-data <script>. Den här metoden kan kringgå samma ursprungspolicy, men den introducerar sårbar kod. JSONRequest har föreslagits som ett säkrare alternativ .
Även om JSON är tänkt att serialiseras, liknar dess syntax JavaScript och detta skapar ett antal säkerhetsproblem. Ofta tillämpas en funktion på data som tas emot från en extern källa i JSON-format eval()utan någon preliminär validering.
Eftersom JSON representeras som en syntaktisk korrekt del av JavaScript-kod, är det enklaste sättet att analysera JSON-data i ett JavaScript-program att använda den inbyggda JavaScript-funktionen eval(), som är utformad för att exekvera JavaScript-uttryck. Med detta tillvägagångssätt finns det inget behov av att använda ytterligare parsers.
Användningstekniken eval()gör systemet sårbart om källan till den använda JSON-datan inte är betrodd . Sådan data kan vara skadlig JavaScript-kod för attacker av Injection Genom att använda denna sårbarhet är det möjligt att utföra datastöld, autentiseringsförfalskning.
En ny funktion har föreslagits JSON.parse()som endast kan behandla JSON-data. Det introducerades i den fjärde versionen av ECMAScript -standarden och beskrivs i artikeln "JSON: A fat-free alternative to XML" [12] . Det är för närvarande tillgängligt som ett JavaScript-bibliotek [13] och har inkluderats i den femte upplagan av ECMAScript.
Senaste versioner av webbläsare har inbyggt stöd för JSON och kan bearbeta det.
Den ogenomtänkta användningen av JSON gör webbplatser sårbara för förfalskning av begäranden på flera ställen (CSRF eller XSRF) [14] . Eftersom taggen <script>tillåter användning av en källa som inte tillhör samma domän som resursen använder, tillåter detta att kod exekveras under sken av JSON-data i sammanhanget av en godtycklig sida, vilket gör det möjligt att kompromissa med lösenord eller annan känslig information om användare som är auktoriserade på en annan webbplats.
Detta verkar bara vara ett problem om JSON-data innehåller känslig information som kan äventyras av en tredje part, och om servern förlitar sig på en policy ursprung för att blockera åtkomst till data när den stöter på en extern begäran Detta är inte ett problem om servern bestämmer giltigheten av begäran och tillhandahåller data endast om den är korrekt. En HTTP-cookie kan inte användas för att fastställa detta. Den exklusiva användningen av en HTTP-cookie utnyttjas av förfalskning av begäranden över flera webbplatser .
JSONP ( JSON Padding ) är en förlängning av JSON när namnet på en återuppringningsfunktion anges som ett inmatningsargument.
Tekniken bygger på att webbläsarens säkerhetspolicy inte förbjuder användningen av taggen <script type="text/javascript" src="…"></script>för att komma åt andra servrar än den server från vilken sidan laddades.
Utan att använda JSONP-teknik (det vill säga att bara använda JSON-datakodning) kan servern bara returnera data. Till exempel, så här:
{ "paper" : "A4" , "count" : 5 }Detta är dock endast data och kan inte påverka webbläsaren.
Med JSONP-tekniken skickas namnet på återuppringningsfunktionen till tredjepartsservern i anropssträngen (GET):
<script type="text/javascript" src="http://example.com/getjson?jsonp=parseResponse"></script>Här innehåller jsonp-parametern callback-namnet för parseResponse-funktionen.
Nu kan den utländska servern example.com returnera följande kod:
parseResponse ({ "paper" : "A4" , "count" : 5 })Nu anropar koden javascript-funktionen för den första domänen.
Idén föreslogs ursprungligen på MacPython-bloggen 2005 [15] och används för närvarande av många Web 2.0- applikationer som Dojo Toolkit Applications, Google Toolkit Applications [ https://www.webcitation.org/6Djo88laj?url=http: / /www.gwtapps.com/?p=42%5d och zanox webbtjänster. Ytterligare tillägg till detta protokoll har föreslagits för att inkludera ytterligare argument, som i fallet med JSONPP [16] som stöds av S3DB -webbtjänster.
Eftersom JSONP använder skripttaggar är samtalen i princip öppna för världen. Av denna anledning kanske JSONP inte är lämpligt för att lagra känslig data [17] .
Genom att inkludera skripttaggar från avlägsna webbplatser kan de skicka allt innehåll på webbplatsen. Om fjärrplatsen har sårbarheter som tillåter Javascript-injektion, kan den ursprungliga platsen också påverkas.
JSONPP ( eng. parametriserad JSON med utfyllnad - "parameteriserad JSON med utfyllnad") - utvecklingen av JSONP-idén.
JSONPP inkluderar käll-URL, namnet på funktionen som kommer att bearbeta JSON-data, strängen att eval efter att data har tagits emot och strängen som ska eval när data är klar:
JSON_call ( SRC , JSONP , JSONPP , ONLOAD );vänder till slut
ans = JSONP ( SRC ) { eval ( JSONPP ( ans )); eval ( ONLOAD ); }I allmänhet är antalet parametrar inte viktigt för själva JSONPP-idén. SRC, JSONP, JSONPP (och deras bearbetning på serversidan och sedan klientsidan) räcker för att det ska bli JSONPP.
Tänk på exemplet med att arbeta med S3DB-tjänsten.
funktion s3db_jsonpp_call ( src , next_eval ){ var call = "call_" + Math . slumpmässigt (). toString (). ersätt ( /\./g , "" ); var headID = dokument . getElementsByTagName ( "huvud" )[ 0 ]; var script = dokument . createElement ( 'script' ); manus . id = samtal ; manus . typ = 'text/javascript' ; // med vadderade, parametriserade json src = src + "&format=json&jsonp=s3db_jsonpp&jsonpp=" + next_eval + "&onload=remove_element_by_id('" + script . id + "')" ; manus . src = src ; headID . appendChild ( skript ); // hämta svar } funktion s3db_jsonpp ( ans , jsonpp ) { eval ( jsonpp ); return ans ; } funktion remove_element_by_id ( id ) { var e = document . getElementById ( id ); e . parentNode . removeChild ( e ); returnera falskt ; }I exemplet skapar funktionen s3db_jsonpp_call()ett skriptelement i huvuddelen av DOM vars src matchar JSONPP-anropet.
Efter att ha mottagit ett svar från servern kommer det att anropas s3db_jsonpp() - det skickas i anropsparametrarna, som det ska vara enligt JSONP-regler.
Internt s3db_jsonpp()kommer att fungera eval(jsonpp)och värdet av ans kommer att returneras.
Att anropa eval(onload) resulterar i exekvering remove_element_by_id()med id för det skapade skriptet i head och så småningom radering av det, eftersom det inte längre kommer att användas ändå, eftersom id:t i exemplet genererades slumpmässigt i början av funktionen s3db_jsonpp_call(). Detta anrop finns i serverns svar.
JSONB är en binär JSON-förlängning som introducerades till PostgreSQL i version 9.4.18. Faktum är att JSONB är en binär representation av JSON [18] , med skillnaden att mellanslag tas bort i lagrade strängar, objektsortering bevaras inte och endast det sista värdet för dubbletter av nycklar lagras [19] .
Dokumentmarkeringsspråk | |
---|---|
kontorsdokument _ | |
välkänd | |
Mindre känd |
Webb och hemsidor | |
---|---|
globalt | |
Lokalt | |
Typer av webbplatser och tjänster |
|
Skapande och underhåll | |
Typer av layouter, sidor, webbplatser | |
Teknisk | |
Marknadsföring | |
Samhälle och kultur |