JSON

JSON står for JavaScript Object Notation. Med JSON kan vi lagre objekt som skal brukast i JavaScript, som rein tekst. Det at dataa blir skilt frå koden, gjer det enklare å endre og halde ved like data som blir brukte av ein applikasjon eller webside. Dette liknar litt på å bruke Firebase eller andre NoSQL-databasar, men forskjellen er at JSON-data kan lagrast lokalt, i den same mappa som websida.
Lagre eitt objekt som JSON
Data i ei JSON-fil har ein spesifikk syntaks som skil seg litt frå korleis ein lagar objekt i JavaScript. Ei JSON-fil kan innehalde eitt objekt eller ei liste (array) med objekt. Her er eit døme på ei JSON-fil med eitt objekt:
1{ 2 "namn":"Fido", 3 "kjonn":"M", 4 "rase":"skotsk terrier", 5 "farge":"svart" 6}
JSON-data blir skrivne, som du kan sjå, som par av feltnamn og verdi, med eit kolon imellom, slik:
"feltnamn":"verdi"
Når vi set fleire felt etter kvarandre, bruker vi komma imellom og krøllparentesar rundt for å angi det som eit objekt.
Dersom eit felt har fleire verdiar, kan vi setje verdiane i ei liste, slik:
1{ 2 "namn":"Fido", 3 "kjonn":"M", 4 "rase":"skotsk terrier", 5 "farge":"svart", 6 "yndlingsmat":["fiskepudding", "griseøyre", "hundemat"] 7}
Lagre fleire objekt som JSON
Som nemnt kan ei JSON-fil innehalde ei liste med fleire objekt. Det kan vi skrive på denne måten:
1[ 2 { 3 "namn":"Fido", 4 "kjonn":"M", 5 "rase":"skotsk terrier", 6 "farge":"svart", 7 "yndlingsmat":["fiskepudding", "griseøyre", "hundemat"] 8 }, 9 { 10 "namn":"King", 11 "kjonn":"M", 12 "rase":"dvergpuddel", 13 "farge":"brun", 14 "yndlingsmat":["pasta", "loff"] 15 }, 16 { 17 "namn":"Bella", 18 "kjonn":"F", 19 "rase":"boxer", 20 "farge":"blond", 21 "yndlingsmat":["biff", "hundemat"] 22 } 23]
Nokre gonger kan det vere nyttig å lagre eitt eller fleire objekt som verdi til eit felt inne i eit objekt. Det må vi gjere dersom vi vil legge til informasjon om eigaren av hunden. Då gjer vi slik:
1[ 2 { 3 "namn":"Fido", 4 "kjonn":"M", 5 "rase":"skotsk terrier", 6 "farge":"svart", 7 "yndlingsmat":["fiskepudding", "griseøyre", "hundemat"], 8 "eigar":{ 9 "namn": "Rebecca Thomasen", 10 "telefon": "12345678" 11 } 12 }, 13 { 14 "namn":"King", 15 "kjonn":"M", 16 "rase":"dvergpuddel", 17 "farge":"brun", 18 "yndlingsmat":["pasta", "loff"], 19 "eigar":{ 20 "namn": "Gabrielle Martin", 21 "telefon": "23456789" 22 } 23 }, 24 { 25 "namn":"Bella", 26 "kjonn":"F", 27 "rase":"boxer", 28 "farge":"blond", 29 "yndlingsmat":["biff", "hundemat"], 30 "eigar":{ 31 "namn": "Jakob Nilsen", 32 "telefon": "2266445" 33 } 34 } 35]
Konvertere JSON-data
Det er mange måtar å få JSON-data inn på nettsida di på. I utgangspunktet er JSON-data berre tekst, så det kan overførast på mange måtar. Ofte vil JSON-data bli lesne inn frå ein webserver, frå ein database eller frå ei tekstfil på datamaskina di. Det finst derfor innebygde metodar i JavaScript for å konvertere JSON-data (tekst) til JavaScript-objekt, og motsett. Dei mest brukte av desse er JSON.parse(), som gjer om JSON-data til JavaScript-objekt, og JSON.stringify(), som gjer om JavaScript-objekt til JSON-data. Desse kan du lese om på W3Schools:
Importere JSON-data
Dersom du har lagra ei JSON-fil saman med nettsida di, eller dersom du har URL-en til ei JSON-fil som ligg på nettet, kan du importere JSON-dataa som ein modul i JavaScript, slik:
import data from "_URL_" with { type: "json" };
Denne koden både importerer JSON-dataa og konverterer dei (parse) til JavaScript-data. Du treng derfor ikkje å bruke metoden JSON.parse().
Merk at når du bruker import, må du legge inn type="module" i script-taggen på nettsida di, slik:
<script type="module">
import data from "_URL_" with { type: "json" };
</script>
Merk òg at data ikkje skal stå i krøllparentesar.
I tilfellet med hundar.json blir JSON-dataa importerte som ei liste med objekt, med variabelnamnet du har sett (data i dømet over). Dette variabelnamnet kan setjast til å vere kva du vil, til dømes hundar. For å hente ut namnet til den første hunden, kan du skrive denne koden:
1import hundar from "./hundar.json" with { type: "json" }; 2 3console.log( hundar[0].namn )
Denne koden vil skrive ut Fido i konsollen.
For å skrive ut informasjon om alle hundane kan du bruke ei lykkje:
1import hundar from "./hundar.json" with { type: "json" }; 2 3for(const hund of hundar){ 4 console.log( 5 `${hund.namn} er ein ${hund.farge} ${hund.rase} eigd av ${hund.eigar.namn}.` 6 ) 7}
Det vil gi denne utskrifta:
1Fido er ein svart skotsk terrier eigd av Rebecca Thomasen. 2King er ein brun dvergpuddel eigd av Gabrielle Martin. 3Bella er ein blond boxer eigd av Jakob Nilsen.
Dersom du i tillegg vil skrive ut yndlingsmaten til hundane, må du bruke ei lykkje inne i lykkja for å skrive ut innhaldet av lista med yndlingsmat for kvar hund. For at utskrifta skal bli fin, må vi trikse litt for å få inn komma og og når vi listar opp dei ulike mattypane. Koden blir slik:
1import hundar from "./hundar.json" with { type: "json" }; 2 3// Lagar variablar som vi skal bruke i lykkja 4let utskrift = ""; 5let pronomen = ""; 6let yndlingsmat = ""; 7let i = 0; 8 9// Lagar ei lykkje for å gå gjennom alle hundane 10for(const hund of hundar){ 11 12 if(hund.kjonn == "F"){ 13 // Set pronomen i utskrifta til "hennar" dersom hunden er hokjønn 14 pronomen = "hennar"; 15 }else{ 16 // Set pronomen i utskrifta til "hans" dersom hunden ikkje er hokjønn 17 pronomen = "hans"; 18 } 19 20 // Lagar ei lykkje for å gå gjennom yndlingsmaten til kvar hund 21 for(const mat of hund.yndlingsmat){ 22 23 if(hund.yndlingsmat.length - 2 > i){ 24 // Set inn komma mellom elementa i utskrifta 25 // for alle unnateke dei siste to elementa i lista 26 yndlingsmat += `${mat}, `; 27 i++; 28 } 29 else if(hund.yndlingsmat.length - 1 > i){ 30 // Set inn nest siste element utan komma 31 yndlingsmat += `${mat} `; 32 i++; 33 }else{ 34 // Set inn "og" framfor siste element 35 yndlingsmat += `og ${mat}`; 36 i++; 37 } 38 39 } 40 41 // Skriv ut til konsollen 42 console.log(`${hund.namn} er ein ${hund.farge} ${hund.rase}\ 43 eigd av ${hund.eigar.namn}. \nYndlingsmaten ${pronomen} er ${yndlingsmat}.`) 44 // Tips: \n i console.log gir linjeskift i konsollutskrifta 45 46 // Nullstiller teljar og utskift av yndlingsmat 47 // før neste gjennomkøyring av lykkja 48 i = 0; 49 yndlingsmat = ""; 50 51}
Då blir utskrifta slik:
1Fido er ein svart skotsk terrier eigd av Rebecca Thomasen. 2Yndlingsmaten hans er fiskepudding, griseøyre og hundemat. 3 4King er ein brun dvergpuddel eigd av Gabrielle Martin. 5Yndlingsmaten hans er pasta og loff. 6 7Bella er ein blond boxer eigd av Jakob Nilsen. 8Yndlingsmaten hennar er biff og hundemat.