# JSON

| JavaScript Object Notation |
| --- |
|  |
| Tiedostopääte | `.json` |
| Mediatyyppi | `application/json` |
| Tyypin koodi | `TEXT` |
| Lyhenne | JSON |
| Standardi(t) | RFC 4627 |
| Verkkosivusto |  |
| Infobox OK |

**JSON** (lyhenne sanoista J**ava**S**cript **O**bject **N**otation*) on yksinkertainen ja kevyt avoimen standardin tiedostomuoto tiedonvälitykseen ja tallennukseen. Ihmisten on helppo lukea ja kirjoittaa JSON-tiedostoja. JSON perustuu JavaScript-ohjelmointikielistandardin ECMA-262 3. painos – joulukuu 1999 osajoukkoon. Nimestään ja JavaScript-perustastaan huolimatta JSON on täysin kielestä riippumaton, mutta käyttää käytäntöjä, jotka ovat tuttuja C-kieliperheestä. Nämä ominaisuudet tekevät JSON:ista erinomaisen tiedonsiirtokielen. Useimmat ohjelmointikielet sisältävät koodin JSON-muotoisen datan luomiseksi ja parsimiseksi. JSON:in Internet media type on `application/json` ja sen tiedostopääte `.json`.

JSON perustuu järjestämättömään joukkoon avain–arvo-pareja. Objekti alkaa vasemmalla aaltosulkeella `{` ja päättyy oikeaan aaltosulkeeseen `}`. Jokainen avain ympäröidään lainausmerkeillä, ja sitten seuraa kaksoispiste `:`. Avain–arvo-parit erotetaan pilkuilla `,` toisistaan. JSON:ia käytetään yleisesti tiedon siirtämiseen verkkosovelluksissa, esimerkiksi tietojen lähettämiseen palvelimelta selaimelle, jotta se voidaan näyttää verkkosivulla tai päinvastoin. JSON muistuttaa nimensä mukaisesti hyvin paljon JavaScriptin objektimuotoa.

JSON-formaatin määritteli alun perin Douglas Crockford vuoden 2000 alussa. Crockford ja Chip Morningstar lähettivät ensimmäisen JSON-viestin huhtikuussa 2001. JSON luotiin vaihtoehdoksi XML:lle, joka oli aikoinaan hallitseva tiedonvaihdon muoto. XML-tiedostojen lukeminen on ihmiselle vaikeaa ja se jättää paljon toivomisen varaa koodauksen ketteryyden suhteen. JSON oli vastaus näihin ongelmiin.

## Esimerkki

Esimerkki kuvitellun henkilön JSON-tiedostosta:

```
{
 "etunimi": "Mari",
 "sukunimi": "Kuusirinne",
 "ikä": 27,
 "osoite": {
 "kadun\_osoite": "Kirkkokatu 15",
 "kaupunki": "Oulu",
 "maakunta": "Kainuun maakunta",
 "postinumero": "90150"
 },
 "puhelin\_numerot": [
 {
 "tyyppi": "työ",
 "numero": "0451231233"
 },
 {
 "tyyppi": "koti",
 "numero": "0503285815"
 }
 ],
 "on\_eläkkeellä": false
}

```

## JSON:in alkutaipale

Crockford ja Morningstarin alkuperäinen ongelma oli, että he halusivat lisätä dataa applikaatiolle alkuperäisen sivuston latauksen jälkeen. Kaikille selaimille oli oma tapansa tehdä lisäykset, mutta he halusivat tavan, joka toimisi yhtenäisesti kaikille selaimille. He päättivät käyttää hyödykseen HTML-datan lähettämistä itselleen. Crockford ja Morningstar hyödynsivät URL-rungon osoitinta, joka palautti HTML-tiedoston, jolloin JavaScript purkaisi sisällön.

Crockford antaa täyden kunnian tekniikan keksimisestä Netscapessa työskentelevälle henkilölle, joka oli käyttänyt samaa tapaa informaation jakamiseen jopa vuodesta 1994 lähtien.

Ensimmäisen JSON-viestin sisältö oli seuraava:

```
<html><head><script>
 document.domain = 'fudco';
 parent.session.receive(
 { to: "session", do: "test",
 text: "Hello world" }
 )
</script></head></html>

```

JavaScriptin käyttäminen JSON:in pohjana ei ollut ongelmatonta, koska JavaScript on varannut paljon sanoja. Näistä yhtä, `do`, he käyttävät vahingossa alkuperäisessä viestissään, jonka takia se ei toiminut. Tämän jälkeen Crockfrod päätti, että kaikki JSON:in avaimet ovat lainausmerkeissä. Tällöin varattujen sanojen kanssa ei ollut ongelmaa, koska JavaScript piti niitä vain merkkijonona. Positiivista oli, että JavaScriptin kääntäjä teki kaiken, joten JSON:ille ei tarvinnut lisätä uusia jäsentelytekniikoita, jotta se toimisi.

Alun perin JSON:in nimeäjät halusivat käyttää formaatillensa nimeä JSML, joka olisi tullut sanoista **J**ava**S**cript **M**arkup **L**anguage (suom. JavaScript-merkintäkieli). Toisin kävi, koska lyhenne oli varattu toiselle JavaScriptin lyhenteelle, jonka jälkeen he päätyivät käyttämään nykyisin tunnettua JSON-nimeä.

Crockfrod ja Morningstar huomasivat myös, että JSON oli erittäin hyödyllinen palvelinten keskeisessä kommunikoinnissa ja datan varastoinnissa. Alussa heidän oli vaikeaa saada ihmiset uskomaan JSON:iin, joka miellettiin tuntemattomaksi ja epästandardiksi formaatiksi. Tämän johdattelemana Crockford osti json.org -sivuston ja loi siitä standardin, jonka jälkeen suosio kasvoi tasaiseen tahtiin.

Kiinnostus Ajaxia kohtaan johti JSON:in suosion räjähdysmäiseen kasvuun. Kun ohjelmistokehittäjät huomasivat voivansa käyttää JSON:ia Ajax-sovelluksissa helposti, alkoivat useimmat heistä suosimaan sitä XML:n sijaan.

## Tuetut tietomuodot

* **Luku**: etumerkillinen desimaaliluku, joka voi sisältää murto-osan ja voi käyttää eksponentiaalista E-merkintää, mutta ei voi sisältää ei-lukuja, kuten `NaN`. Muoto ei tee eroa kokonaislukujen ja liukulukujen välillä. JavaScript käyttää IEEE-754-kaksoistarkkuutta liukulukumuotoa kaikissa numeerisissa arvoissaan, mutta muut JSON:ia käyttävät kielet voivat koodata numeroita eri tavalla.
* **Merkkijono**: nollan tai useamman Unicode-merkin sarja. Merkkijonot on rajattu lainausmerkeillä, ja ne tukevat kenoviivaa.
* **Boolean-arvo**: joko *tosi* (`true`) tai *epätosi* (`false`).
* **Taulukko**: järjestetty luettelo nollasta tai useammasta elementistä, joista jokainen voi olla mitä tahansa tyyppiä. Taulukot rajoittuvat hakasulkeisiin `[]` ja elementit erotetaan pilkuilla toisistaan.
* **Objekti**: kokoelma nimi–arvo-pareja, joissa nimet (kutsutaan myös avaimiksi) ovat merkkijonoja. Nykyinen ECMA-standardi sanoo: "JSON-syntaksi ei aseta mitään rajoituksia niminä käytettäville merkkijonoille, ei vaadi nimimerkkijonojen olevan yksilöllisiä, eikä anna mitään merkitystä nimi/arvo-parien järjestykselle. Objektit erotetaan aaltosulkeilla `{}` ja nimi–arvoparit erotetaan pilkuilla. Kussakin nimi–arvo-parissa kaksoispiste `:` erottaa avaimen tai nimen sen arvosta.
* **null**: tyhjä arvo (`null`).

## Standardit

JSON:ia koskevia standardointidokumentteja:

* RFC 4627
* ECMAScript 262, kappale 15.12
* ECMA 404
* RFC 7159 (korjaus versioon RFC 7158)
* RFC 8259

## Muihin tiedostomuotoihin vertaaminen

JSON tunnetaan XML:ää kevyempänä vaihtoehtona. Kummallakin tiedostomuodolla on laaja tuki luomiseen, lukemiseen ja purkamiseen todellisissa tilanteissa, joissa niitä yleisesti käytetään. XML:n lisäksi muita esimerkkejä voivat olla CSV ja YAML (JSON-superjoukko). Myös Googlen Protocol Bufferit voivat täyttää tämän roolin, vaikka ne eivät olekaan tiedonsiirtokieliä.

### YAML

YAML-versio 1.2 on JSONin superjoukko; aiemmat versiot eivät olleet täysin yhteensopivia. Esimerkiksi etukenon `/` pystyy sulkemaan takakenolla `\` JSON-tiedostomuodossa, mutta YAML ei tukenut tätä. YAML tukee kommentointia, kun taas JSON ei.

### XML

XML:ää on käytetty strukturoidun tiedon kuvaamiseen ja objektien sarjallistamiseen. Monia XML-pohjaisia protokollia on luotu edustamaan samanlaisia tietorakenteita kuin JSON, joita käytetään samanlaisiin tiedonvaihtotarkoituksiin. Dataa voidaan koodata XML-muotoon usealla tavalla. Laajennettavin muoto, jossa käytetään tagipareja tuottaa paljon suuremman tiedoston (merkkimäärällisesti) kuin JSON, mutta jos tiedot tallennetaan attribuuteissa ja "lyhyt tagi" -muodossa, jossa sulkeva tagi korvataan `/>`:lla, tiedostosta tulee yhtä pitkä tai hieman pidempi kuin vastaavasta JSON tiedostosta. XML-attribuutilla voi kuitenkin olla vain yksi arvo, ja jokainen attribuutti voi esiintyä enintään kerran kussakin elementissä.

XML erottaa varsinaisen datan metadatasta elementtien ja attribuuttien avulla, kun taas JSONissa ei ole samanlaista käsitettä.

Toinen keskeinen ero on arvojen osoittamisessa. JSON:issa on objekteja, joissa on yksinkertainen avain–arvo-kartoitus, kun taas XML-osoitteiden määrittäminen tapahtuu "solmuissa", jotka kaikki saavat yksilöllisen ID:n XML-prosessorin kautta. Lisäksi XML-standardi määrittelee yhteisen atribuutin `xml:id`, jota käyttäjä voi käyttää täsmällisen ID:n antamiseen.

## Käyttökohteita

JSON-RPC on JSON:in päälle rakennettu RPC-protokolla. Se on yksinkertainen protokolla, joka määrittelee vain kourallisen tietotyyppejä ja komentoja. JSON-RPC antaa järjestelmän lähettää ilmoituksia ja useita kutsuja palvelimelle, joihin voidaan vastata vapaassa järjestyksessä.

AJAJ (akronyymi sanoista Asynchronous JavaScript and JSON) viittaa samaan dynaamisten verkkosivujen metodologiaan kuin AJAX, mutta JSON on käytetty tiedostomuoto XML:n sijaan. AJAJ on web-kehitystekniikka, joka tarjoaa verkkosivulle mahdollisuuden pyytää uutta dataa selaimelle lataamisen jälkeen. Tyypillisesti se lataa uutta dataa palvelimelta vastauksena verkkosivun käyttäjän toimille. Esimerkiksi käyttäjän kirjoittaessa hakukenttään syötteen, verkkosivu lähettää sen palvelimelle, jolloin se vastaa pudotusvalikolla syötettä vastaavista tietokannan tuloksista.

Vaikka JSON:ia on käytetty määrityskielenä, siinä ei kuitenkaan ole tukea kommenteille. Vuonna 2012 Douglas Crockford kommentoi asiaa seuraavasti: ”Tiedän, että kommenttien puute tekee ihmiset surulliseksi, mutta ei sen pitäisi. Oletetaan, että käytätte JSON:ia säilyttääksenne asetustiedostot, joita haluaisitte kommentoida. Lisätkää kaikki haluamanne kommentit. Ohjaa se sitten JSMinin kautta ennen kuin annat sen JSON-jäsentäjälle.”

MongoDB käyttää JSON-tyyppistä dataa dokumenttipohjaisessa tietokannassaan.

Jotkin relaatiotietokannat, kuten PostgreSQL ja MySQL, ovat lisänneet tuen JSON-tietotyypille. Näin kehittäjät voivat tallentaa JSON-dataa suoraan relaatiotietokantaan ilman, että sitä tarvitsee muuntaa toiseen dataformaattiin. Natiivin JSON-tietotyypin myötä SQL-kyselyitä voi kohdistaa suoraan JSON-arvoihin.

## Katso myös

* JSON Web Token
* YAML
* Ajax
* XML

## Lähteet

## Aiheesta muualla

* The JSON Specification
* Yleistä JSON:sta suomeksi
* Parsing JSON is a Minefield (englanniksi)
* JSON Schema (englanniksi)