JSON

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 28 augusti 2021; kontroller kräver 14 redigeringar .
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ʒ 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.

Användning

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().

Syntax

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

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 enradiga //och flerradiga /* */kommentarer stöds.
  • Poster och listor kan ha ett kommatecken efter det sista elementet (användbart vid kopiering av element).
  • Inmatningsnycklar kan vara utan citattecken om de är giltiga ECMAScript 5-identifierare.
  • Strängar kan omges av antingen enkla eller dubbla citattecken.
  • Tal kan vara hexadecimala, börja eller sluta med en decimalkomma, inkludera Infinity, -Infinity, NaN och -NaN, och börja med ett +-tecken.

Jämförelse med YAML

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:

  • stöd för relationsdata : i ett YAML-dokument kan du referera till ett ankare som tidigare påträffades i en fil/ström; rekursiva strukturer kan uttryckas på detta sätt .
  • stöd för utökningsbara datatyper bortom primitiver : strängar, siffror, booleaner, etc.
  • blockeringssyntaxstöd med indrag ; den låter dig beskriva strukturerad data utan att använda extra tecken: alla typer av parenteser, citattecken, etc.

JSON Schema

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-LD-format för länkade data

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] .

Använder JSON i Ajax

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 .

Säkerhetsproblem

Ä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.

JavaScript eval()

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.

Inbäddad JSON

Senaste versioner av webbläsare har inbyggt stöd för JSON och kan bearbeta det.

Förfalskning av begäranden över flera domäner

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 och JSONPP

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

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] .

Se även

Anteckningar

  1. https://www.file-extension.info/format/json
  2. Crockford D. The application/json Media Type for JavaScript Object Notation (JSON)  (engelska) - IETF , 2006. - 10 sid. doi : 10.17487/RFC4627
  3. Doug Crockford "Google Tech Talks: JavaScript: The Good Parts" (7 februari 2009). Hämtad 28 september 2017. Arkiverad från originalet 29 juli 2017.
  4. JSON Redux AKA RFC7159 . Hämtad 12 september 2014. Arkiverad från originalet 2 juli 2014.
  5. JSON-RPC 1.1 Alt: Service, procedur och parameternamn . Hämtad 28 april 2016. Arkiverad från originalet 9 mars 2016.
  6. JSON5 av aseemk . Hämtad 26 november 2015. Arkiverad från originalet 11 december 2015.
  7. In The Wild json5/json5 Wiki GitHub . Hämtad 27 januari 2017. Arkiverad från originalet 5 december 2020.
  8. YAML Ain't Markup Language (YAML™) version 1.2  (  död länk) . — Arbetsutkast 2008-05-11. Tillträdesdatum: 24 september 2009. Arkiverad från originalet den 16 maj 2008.
  9. YAML är JSON . RedHanded (7 april 2005). Hämtad 25 september 2012. Arkiverad från originalet 7 december 2012. .
  10. json.com. JSON Schema Proposal  (engelska)  (länk ej tillgänglig) . Arkiverad från originalet den 14 maj 2008.
  11. JSON-LD Syntax 1.0 (27 december 2011). Datum för åtkomst: 30 december 2011. Arkiverad från originalet den 12 januari 2012.
  12. ↑ JSON : Ett fettfritt alternativ till XML  . Arkiverad från originalet den 12 februari 2012.
  13. json2.js  . _ Hämtad 24 september 2009. Arkiverad från originalet 12 februari 2012.
  14. Jeremy Grossman. Avancerade attacktekniker för webbapplikationer med  Gmail . vit hatt säkerhet. Hämtad 23 september 2009. Arkiverad från originalet 12 februari 2012.
  15. från __future__ import * » Remote JSON - JSONP . Bob.pythonmac.org. Hämtad 8 september 2008. Arkiverad från originalet 12 februari 2012.
  16. Almeida, Jonas. JSON, JSONP, JSONPP?  (neopr.) . - S3DB, 2008. - 11 juni. Arkiverad från originalet den 15 februari 2017.
  17. RIAspot. JSON P för Cross Site XHR (inte tillgänglig länk) . Arkiverad från originalet den 5 december 2008. 
  18. När ska man använda ostrukturerade datatyper i PostgreSQL? Hstore vs. JSON vs. JSONB  (ryska)  (29 juli 2016). Arkiverad från originalet den 4 juli 2018. Hämtad 4 juli 2018.
  19. Varför PostgreSQL är bättre än andra SQL-databaser med öppen källkod. Del 1  (ryska)  (29 april 2016). Arkiverad från originalet den 4 juli 2018. Hämtad 4 juli 2018.

Länkar