JavaScript Object Notation
| JavaScript Object Notation | |
|---|---|
|
| |
| Filtillägg : |
.json
|
| MIME -typ : | ansökan / json |
| Standard (er) : | RFC 8259 , ECMA-404 (PDF) |
| Webbplats : | https://json.org/ |
Den JavaScript Object Notation ( JSON [ dʒeɪsən ]) är en kompakt dataformat i ett lättlästa textform för datautbyte mellan program. JSON är oberoende av programmeringsspråket. Parsers och generatorer finns på alla vanliga språk.
JSON specificerades ursprungligen av Douglas Crockford . För närvarande (i slutet av 2017) specificeras den av två olika standarder, men med samma innehåll - RFC 8259 och ECMA -404.
Användningsområden
JSON används för att överföra och lagra strukturerad data. Det fungerar som dataformat för dataöverföring ( serialisering ). I synnerhet i webbapplikationer och mobilappar används det ofta tillsammans med JavaScript , Ajax eller WebSockets för att överföra data mellan klienten och servern.
Datastruktur och formatdefinition
Teckenkodning och datatyper
Data kan kapslas efter önskemål, till exempel är en indexerad lista ("array") med objekt möjlig, som i sin tur innehåller matriser eller objekt. Som standard använder JSON UTF-8 som teckenkodning . Även UTF-16 och UTF-32 är möjliga.
JSON kan följande typer av element .
- Nollvärde
- representeras av nyckelordet
null. - Boolskt värde
- representeras av sökorden
trueochfalse. Det här är inte strängar. De kommer därför att gillanull, inte i citat. - siffra
- är en sekvens av siffror
0-9. Denna sekvens kan initieras av ett negativt tecken-och avbrytas med en decimal.. Numret kan kompletteras med att ange en exponenteellerE, som följs av ett valfritt tecken+eller-och en sekvens av siffror0-9. - Sträng
- börjar och slutar med dubbla raka citattecken (
"). Den kan innehålla Unicode -tecken och\initierade Escape -sekvenser . - Array
- börjar med
[och slutar med]. Den innehåller en indexerad lista, dividerad med kommatecken, med element av samma eller olika typer. Tomma matriser är tillåtna.
- objekt
- börjar med
{och slutar med}. Den innehåller en orörd lista över egenskaper, åtskilda med kommatecken . Objekt utan egenskaper ("tomma objekt") är tillåtna.- karakteristisk
- består av en nyckel och ett värde, separerade med ett kolon (
Schlüssel : Wert). Nycklarna bör vara unika, eftersom olika parsers hanterar dubblettnycklar olika. Även om ECMA-404 inte kräver unikhet, kräver RFC 7159 att nycklarna är unika i ett objekt.- den nyckeln är en sträng .
- det värde är något elementet .
Obetydliga vita blanksteg kan användas.
begränsningar
JSON stöder inte alla datatyper som stöds av JavaScript. För datatyper som inte stöds utförs serialisering enligt följande:
-
NaN,InfinityOch-Infinityärnullserialiseras till. -
Date-Objekt konverteras till en teckensträng som uppfyller en datumformatbeskrivning enligt ISO-8601 . -
Function-,RegExp- ochErrorär -objects kasseras.
exempel
{
"Herausgeber": "Xema",
"Nummer": "1234-5678-9012-3456",
"Deckung": 2e+6,
"Waehrung": "EURO",
"Inhaber":
{
"Name": "Mustermann",
"Vorname": "Max",
"maennlich": true,
"Hobbys": ["Reiten", "Golfen", "Lesen"],
"Alter": 42,
"Kinder": [],
"Partner": null
}
}
JSON -schema
JSON-schema anger ett JSON-baserat format för att definiera strukturen för JSON-data för validering , dokumentation och interaktionskontroll. Den innehåller ett kontrakt för JSON -data som krävs för en viss applikation och hur den kan ändras.
JSON-schemat är baserat på begreppen i XML-schemat , men är JSON-baserat. Som i XSD kan samma serialiserings- och deserialiseringsprogram användas för både schemat och data. Det är självbeskrivande och fastställt i ett Internetutkast av Internet Engineering Task Force . Flera validerare , var och en med olika överensstämmelsesnivåer, finns tillgängliga för olika programmeringsspråk .
exempel
{
"$schema": "http://json-schema.org/draft/2019-09/schema",
"title": "Politiker",
"type": "object",
"required": ["Vorname", "Nachname", "Geburtsdatum", "Nationalitaet"],
"properties":
{
"Vorname":
{
"type": "string"
},
"Nachname":
{
"type": "string"
},
"Geburtsdatum":
{
"type": "date"
},
"Nationalitaet":
{
"type": "string"
},
"Partei":
{
"type": "object",
"properties":
{
"Name":
{
"type": "string"
},
"Hauptsitz":
{
"type": "string"
},
"Gründungsdatum":
{
"type": "date"
},
"Gründungsort":
{
"type": "string"
}
}
},
"Amt":
{
"type": "string"
}
}
}
Ovanstående JSON -schema kan användas för att testa giltigheten av följande datablock:
{
"Vorname": "Ronald",
"Nachname": "Reagan",
"Geburtsdatum": "1911-02-06",
"Nationalitaet": "US-amerikanisch",
"Partei":
{
"Name": "Republican Party",
"Hauptsitz": "Washington, D.C.",
"Gründungsdatum": "1854-03-20",
"Gründungsort": "Ripon"
},
"Amt": "US-Präsident"
}
Jämförelse med XML
Både JSON och XML beskriver strukturen för en datapost. Dataposten kan innehålla ytterligare dataposter, vilket innebär att strukturer kan häckas så djupt som önskat.
De enskilda noderna i datastrukturen heter i XML, medan noderna är namnlösa i JSON.
I XML kan enkla teckensträngar beskrivas både som ett attribut för ett element och som ett separat element; i JSON finns ingen sådan skillnad. Denna flexibilitet, som i de flesta fall är irrelevant, innebär att XML -dokumentens struktur ofta skiljer sig i onödan.
Det finns beskrivningsspråk för både JSON och XML för att ytterligare begränsa hur "giltiga" dokument ser ut, i motsats till "välformade" dokument.
Syntaxen för JSON är mycket enklare och verkar därför ofta mer läsbar och i synnerhet lättare att skriva. Vanligtvis producerar JSON också mindre omkostnader jämfört med XML.
Både JSON och XML måste läsas in av en speciell parser. Traditionellt är varje välformat JSON-dokument ett giltigt JavaScript-uttryck, men vårdslöst tolkning av JSON-dokument med eval leder till säkerhetsluckor .
Både JSON och XML är inte väl lämpade för att representera binära data eftersom båda dataformaten är teckenbaserade som primitiva och inte bytebaserade.
Som jämförelse ovanstående exempel i ett XML -formulär:
<Kreditkarte Herausgeber="Xema" Nummer="1234-5678-9012-3456" Deckung="2e+6" Waehrung="EURO">
<Inhaber Name="Mustermann" Vorname="Max" maennlich="true" Alter="42" Partner="null">
<Hobbys>
<Hobby>Reiten</Hobby>
<Hobby>Golfen</Hobby>
<Hobby>Lesen</Hobby>
</Hobbys>
<Kinder />
</Inhaber>
</Kreditkarte>
Efter att ha tagit bort valfria mellanslag är JSON -objektet 226 byte och XML -objektet 279 byte - en ökning med 23%. Ofta kan attribut också formuleras som barnnoder, exemplet kan då se ut så här:
<Kreditkarte>
<Herausgeber>Xema</Herausgeber>
<Nummer>1234-5678-9012-3456</Nummer>
<Deckung>2e+6</Deckung>
<Waehrung>EURO</Waehrung>
<Inhaber>
<Name>Mustermann</Name>
<Vorname>Max</Vorname>
<maennlich>true</maennlich>
<Hobbys>
<Hobby>Reiten</Hobby>
<Hobby>Golfen</Hobby>
<Hobby>Lesen</Hobby>
</Hobbys>
<Alter>42</Alter>
<Kinder />
<Partner>null</Partner>
</Inhaber>
</Kreditkarte>
Om mellanslag tas bort skulle objektet vara 361 byte stort - en ökning med 60% jämfört med JSON -objektet.
JSONP (JSON med vaddering)
| JSONP (JSON med vaddering) | |
|---|---|
| |
| Filtillägg : |
.jsonp
|
| MIME -typ : | application / json-p |
| Standard (er) : | RFC 7159 , RFC 4329 |
| Webbplats : | json-p.org |
Med JSONP (JSON med vaddering) integreras JSON -data via ett <script>element och utdata inklusive ett funktionssamtal. Detta möjliggör överföring av JSON -data över domängränser , men är full av säkerhetsrisker.
JSONP introducerades av Bob Ippolito 2005 och stöds nu av många Web 2.0 -applikationer som Dojo Toolkit , jQuery , Google Web Toolkit Applications och Web Services. Tillägg har föreslagits för detta protokoll som tillåter ytterligare ingångsparametrar, till exempel: B. JSONPP.
funktionalitet
Ajax -datafrågor till servrar görs vanligtvis via XMLHttpRequest -objektet i en webbläsare . På grund av samma ursprungspolicy fungerar detta inte om webbplatsen som visas i en webbläsare försöker använda detta objekt för att komma åt en server som är på en annan domän än den webbplats som visas. Problemet kan kringgås med JSONP. I srcattributet för ett <script>element är det möjligt att ange vilken URL som helst. Samma ursprungspolicy gäller inte detta attribut. Så det är möjligt att ange en URL i en annan domän som returnerar JSON -data, till exempel. Men detta manus skulle inte ha någon effekt.
För att kunna behandla JSON -data på klienten , packar servern dem som parametrar i en JavaScript -funktion som redan är definierad i webbläsaren. Namnet på denna funktion kommuniceras vanligtvis till servern i frågesträngen i URL: en, även om det exakta formatet eller namnet på parametern inte är standardiserat.
Exempel:
JSONP -data är integrerade i HTML -koden för en webbplats enligt följande:
<script type="text/javascript"
src="https://example.com/getjson?jsonp=exampleCallback">
</script>
Servern genererar sedan ett JavaScript -kodavsnitt där den faktiska data överförs till den nämnda funktionen:
exampleCallback( {"name":"Jane Doe", "value":4711} );
Webbläsaren utför sedan detta funktionsanrop som om det hade skrivits ner direkt på HTML -sidan och kan därmed behandla JSON -data från samtalet.
Vanligtvis krävs ett separat <script>element för varje JSONP -samtal .
Säkerhetsrisker
<script>Element gör att en server kan överföra allt innehåll (inte bara JSON -objekt) till webbläsaren. Detta kan leda till att en skadlig webbtjänst spionerar ut privat information i webbläsaren via data som skickas tillbaka eller ändrar den till dess fördel ( skript över flera webbplatser ).
Eftersom <script>elementet inte följer samma ursprungspolicy kan en skadlig webbplats begära och utvärdera JSONP-data som inte är avsedda för den ( Cross-Site-Request-Forgery ). Problemet uppstår när känslig data måste skyddas från tredje part.
alternativ
Med Cross-Origin Resource Sharing (CORS) finns en jämförbar metod som möjliggör åtkomst över domängränser, men utan att ge den begärda resursen möjlighet att köra någon JavaScript-kod. Båda metoderna kräver stöd från lämplig resurs, med CORS lättare att implementera. Samtidigt tillåter CORS en enkel begränsning för den del av resursen från vilken datakällor (ursprung, det vill säga webbadresser, domäner, etc.) kan användas.
CORS är vanligtvis att föredra framför JSONP eftersom CORS är enklare och säkrare överlag.
JSON -tillägg
JSON-LD används för att bädda in RDF- data.
Den Hypertext Application Language (HAL) används för att implementera HATEOAS i JSON-baserade REST gränssnitt .
JSON Hyper-Schema används för att kommentera datatyper i JSON.
JSON-streaming med de tre varianterna Linjeavgränsade JSON (LDJSON), Newline-avgränsade JSON (NDJSON) och JSON-linjer (JSONL).
GBSON används för att kommentera nukleinsyrasekvenser ( DNA och RNA ).
Liknande tekniker
Hjson erbjuder en alternativ syntax som är mer flexibel och därmed förenklar skapandet av människor. På grund av den långsammare bearbetningshastigheten rekommenderas det dock bara att använda det för konfigurationsfiler.
YAML är ett liknande dataformat, men mycket mer komplicerat. YAML 1.2 kan ses som en superset av JSON, eftersom varje JSON -dokument också kan representeras som ett YAML -dokument.
Binära JSON -varianter finns tillgängliga med BSON (Binary JSON), som används bland annat. av MongoDB och med JSONB som används av PostgreSQL . Googles protokollbuffertar (protobuf) följer ett liknande tillvägagångssätt , som, till skillnad från JSON eller BSON, bygger på ett schema. Även baserat på JSON är systemet fria CBOR, som är optimerad för platsbesparande serialisering och bearbetning hastighet .
NeXTstep och macOS använder en liknande teknik för att ladda eller spara enkla objektträd. De kallas Fastighetslistor där . Dessa tillåter också lagring av värden för typerna array , ordlista , booleskt värde, binära data, datum, nummer och teckensträngar. Dessa kodas antingen som XML, som kompakt binärt format eller som ASCII eller UTF-8.
Den Tool Command Language vet ordböcker (dict), som också kan innehålla några kapslade, namngivna strukturer. Dessa är också strukturerade strängar. Den extra ansträngningen (engelska "overhead") reduceras avsevärt jämfört med JSON eftersom inga kolon eller citattecken krävs. Det finns dock ingen tydlig åtskillnad mellan objektstrukturer (egenskap / värde) och tabeller ("matriser", här kallade listor). Därför är det alltid klart och enkelt möjligt att överföra JSON -data till en dikt , men inte tvärtom.
Se även
- Gson är ett Java -bibliotek som konverterar Java -objekt till JSON
- Konfigurationsfil # filformat
Ett annat alternativ till JSON är dataformatet Simple Markup Language (SML). Precis som JSON erbjuder den alternativ för minifiering för att uppnå små filstorlekar och kommentarer som JSON inte har som standard.
webb-länkar
- json.org/json-de.html - Tysk introduktion på den officiella JSON -sidan (andra språk tillgängliga)
- Snabba upp AJAX med JSON Introduktion till JSON, där skillnaderna i XML utarbetas (engelska)
- Parsing JSON är ett Minefält - Översikt över de olika standarderna och implementeringarna
- JSON Viewers onlineplattform för formatering, validering och utbyte av JSON -data
- jsonp.eu - Förklaringar och programmeringsexempel för JSON with Padding (JSONP)
Individuella bevis
- ^ Douglas Crockford: JavaScript Object Notation (JSON) Data Interchange Format . 2017 (engelska, online [PDF; åtkomst den 5 januari 2017]).
- ↑ ECMA International (red.): JSON Data Interchange Format . 2013 (engelska, online [PDF; nåddes den 22 april 2014]).
- ↑ RFC 4627 - Programmet / json Media Type för JavaScript Object Notation (JSON) . Juli 2006. Avsnitt 2: JSON Grammar. (Engelsk).
- ↑ JSON -schema
- ↑ webbarkiv ( Memento från 4 mars 2016 i Internetarkivet )
- ↑ Fjärrkontroll JSON - JSONP . I: från __future__ import * . Bob.pythonmac.org. 5 december 2005. Hämtad 23 januari 2011.
- ↑ jQuery API . Hämtad 23 januari 2011.
- ↑ GWT-handledning: Hur man läser webbtjänsters klientsida med JSONP . I: Google Web Toolkit -applikationer . 6 februari 2008. Arkiverad från originalet den 17 januari 2013. Hämtad 23 januari 2011.
- ↑ Jonas Almeida: JSON, JSONP, JSONPP? . S3DB. 11 juni 2008. Hämtad 23 januari 2011.
- ^ Jeremiah Grossman: Avancerade webbattacker med GMail . 27 januari 2006. Hämtad 23 januari 2011.
- ^ Mike Kelly: JSON Hypertext Application Language. IETF Network Working Group, 12 oktober 2016, öppnade 7 december 2016 .
- ^ Austin Wright, Geraint Luff: JSON Hyper-Schema: A Vocabulary for Hypermedia Annotation of JSON. IETF , 13 augusti 2016, öppnades 7 december 2016 .
- ↑ GBSON. Ett nytt annotationsfilformat baserat på JSON. Åtkomst 24 november 2019 .
- ↑ YAML Ain't Markup Language (YAML ™) Version 1.2
- ↑ bsonspec.org
- ↑ PostgreSQL 12 -dokumentation, 8.14. JSON -typer
- ^ Vad är protokollbuffertar?
- ↑ Protocol Buffers - Googles datautbytesformat
- ↑ CBOR - Kortfattad binärobjektrepresentation | Översikt. Hämtad 16 februari 2019 .
- ↑ Introduktion till fastighetslistor. I: developer.apple.com. Hämtad 6 november 2011 .
