JSON (JavaScript Object Notation, som jeg uttaler "Jason", og du kan uttale uansett) er et tekstbasert datformat som er utformet for å være menneskelig lesbart, lett og enkelt å overføre mellom en server og en webklient. Syntaxen er hentet fra JavaScript - dermed navnet - men det kan brukes på de fleste språk, inkludert AS3 og C #.
Hvis du har gjort mye programmering, har du kommet over arrays før: samlinger av elementer, hver tildelt til et bestemt heltall.
I JSON vil en rekke av de første seks bokstavene i alfabetet bli representert slik:
["A B C D E F"]
AS3 og JavaScript-kodere vil finne ovennevnte liste veldig kjent. Det ligner på C # måten å definere en matrise også.
Som du sikkert kan gjette, sier firkantede parentes "dette er en matrise", og kommaer brukes til å skille forskjellige elementer (merk at det ikke er noen komma etter det endelige elementet). Forutsatt at språket der du analyserer JSON, bruker nullbaserte arrays (og hvor mange språk ikke, disse dager?), element 0 blir "a", 1 blir "b", 2 blir "c" og så videre.
For å gjøre arrays enklere å lese, skriver vi ofte dem med ekstra nyhetslinjer og innrykk:
[ "A B C D E F" ]
Legg merke til at det fortsatt ikke er noen komma etter det endelige elementet, så det ser nå litt rart ut.
Vi trenger ikke å bruke strenger som elementene i et JSON-array; Vi kan også bruke tall, ekte
, falsk
, og null
. Det er ingen streng skriving, noe som betyr at du kan blande de verdiene du bruker i et gitt array. For eksempel er dette helt gyldig:
["apple", 3, 912, null, -7.2222202, "#", sann, falsk]
Merk at du må bruke dobbelt anførselstegn ("
) å omgir alle dine strenger; enkelt anførselstegn ('
) er ikke lov. Ja, dette er tilfelle, selv om JavaScript lar deg legge til strengene i begge typer sitat. Hvis du vil bruke doble anførselstegn i JSON-strenger, bruk \"
i stedet.
Et array er en samling av elementer der hver er tilordnet et bestemt heltall. Et objekt er en samling av elementer der hver er tildelt en bestemt string. Elementene kalles verdier, og strengene som brukes til å identifisere dem, kalles nøkler. Noen programmeringsspråk kaller denne typen datastruktur a hashbord eller hash kart.
Vi kunne representere folks aldre i et objekt som dette:
"Alan": 44, "John": 58, "Brian": 19, "Eliza": 4, "Jessie": 58
Krøllete braces sier "dette er et objekt", og - som med arrays - kommas separere forskjellige elementer. Elementene er imidlertid gitt i parene, denne gangen. Det er lettere å se om vi legger til noen nye linjer og innrykk:
"Alan": 44, "John": 58, "Brian": 19, "Eliza": 4, "Jessie": 58
I hvert par separerer et kolon nøkkelen (som er en streng) fra verdien (som i dette tilfellet er et tall). Når vi lagde en matrise, behøvde vi ikke å spesifisere hvilket heltall hvert element ble tildelt (dvs. vi behøvde bare spesifisere verdiene og ikke nøklene), fordi de ble tildelt basert på rekkefølgen de ble skrevet inn i matrisen.
I stedet for å be om det andre eller femte elementet, som du vil når du åpner en matrise, med et objekt, vil du be om elementet "Alan" eller "Eliza".
For å gjøre ting mer forvirrende, tillater objekter deg også å bruke strenge som verdiene - ikke bare tastene. Så du kan ha et objekt som dette:
"Activetuts +": "http://active.tutsplus.com/", "Psdtuts +": "http://psd.tutsplus.com/", "Nettuts +": "http://net.tutsplus.com/ "," Aetuts + ":" http://ae.tutsplus.com/ "," Vectortuts + ":" http://vector.tutsplus.com/ "," Audiotuts + ":" http://audio.tutsplus.com / "," Cgtuts + ":" http://cg.tutsplus.com/ "," Phototuts + ":" http://photo.tutsplus.com/ "," Webdesigntuts + ":" http: //webdesign.tutsplus. com / "," Mobiletuts + ":" http://mobile.tutsplus.com/ "
På denne måten, for å hente nettadressen for et gitt Tuts + -nettsted, kan du be om det ved å bruke navnet på nettstedet som en nøkkel. Det motsatte er imidlertid ikke sant - du kan ikke bruke "http://cg.tutsplus.com/" for å hente "Cgtuts +".
De samme reglene om ulike typer anførselstegn gjelder for gjenstander som arrays. Objekter kan også bruke strenge, tall, ekte
, falsk
, og null
som verdier (men bare strenger som nøkler).
Objekter og arrayer kan også lagre andre objekter og arrayer. Dette lar oss lage nestede datastrukturer; for eksempel:
"Activetuts +": "url": "http://active.tutsplus.com/", "hasPremium": true, "Psdtuts +": "url": "http://psd.tutsplus.com/ "," hasPremium ": true," Atiluts + ": " url ":" http: //europe.tutsplus.com/ "," hasPremium ": true," Vectortuts + ": " url ":" http://vector.tutsplus.com/ "," hasPremium ": true," Audiotuts + ": "url": "http://audio.tutsplus.com/", "hasPremium": true, "Cgtuts +": "url": "http://cg.tutsplus.com/", "hasPremium" : true, "Phototuts +": "url": "http://photo.tutsplus.com/", "hasPremium": true, "Webdesigntuts +": "url": "http: //webdesign.tutsplus .com / "," hasPremium ": false," Mobiletuts + ": " url ":" http://mobile.tutsplus.com/ "," hasPremium ": false
La oss se det med litt mer whitespace:
"Activetuts +": "url": "http://active.tutsplus.com/", "hasPremium": true, "Psdtuts +": "url": "http://psd.tutsplus.com/ "," hasPremium ": true," Atiluts + ": " url ":" http: //europe.tutsplus.com/ "," hasPremium ": true," Vectortuts + ": " url ":" http://vector.tutsplus.com/ "," hasPremium ": true," Audiotuts + ": "url": "http://audio.tutsplus.com/", "hasPremium": true, "Cgtuts +": "url": "http://cg.tutsplus.com/", "hasPremium" : true, "Phototuts +": "url": "http://photo.tutsplus.com/", "hasPremium": true, "Webdesigntuts +": "url": "http: //webdesign.tutsplus .com / "," hasPremium ": false," Mobiletuts + ": " url ":" http://mobile.tutsplus.com/ "," hasPremium ": false
Hvert objekt inneholder to felt: ett med nøkkelen "URL"
hvis verdi er en streng som inneholder nettadressen til nettstedet, og en med nøkkelen hasPremium
hvis verdi er en boolsk som er sant hvis nettstedet har en Premium-seksjon.
Vi er ikke begrenset til å ha nøyaktig samme struktur for hvert objekt i JSON, skjønt. For eksempel kan vi legge til en ekstra nettadresse som peker på Premium-programadressen, men bare for de nettstedene som har en:
"Activetuts +": "url": "http://active.tutsplus.com/", "hasPremium": true, "premiumUrl": "http://tutsplus.com/Premium-program/active-Premium/ "," Psdtuts + ": " url ":" http://psd.tutsplus.com/ "," hasPremium ": true," premiumUrl ":" http://tutsplus.com/Premium-program/psd- Premium / "," Nettuts + ": " url ":" http://net.tutsplus.com/ "," hasPremium ": true," premiumUrl ":" http://tutsplus.com/Premium-program/ netto-Premium / "," Aetuts + ": " url ":" http://ae.tutsplus.com/ "," hasPremium ": true," premiumUrl ":" http://tutsplus.com/Premium- Program / ae-Premium / "," Vectortuts + ": " url ":" http://vector.tutsplus.com/ "," hasPremium ": true," premiumUrl ":" http://tutsplus.com/ Premium-program / vektor-Premium / "," Audiotuts + ": " url ":" http://audio.tutsplus.com/ "," hasPremium ": true," premiumUrl ":" http: // tutsplus. com / Premium-program / lyd-Premium / "," Cgtuts + ": " url ":" http://cg.tutsplus.com/ "," hasPremium ": true," premiumUrl ":" http: // tutsplus.com/Premium-program/cg-Premium/ "," Phototuts + ": " url " : "http://photo.tutsplus.com/", "hasPremium": true, "premiumUrl": "http://tutsplus.com/Premium-program/photo-Premium/", "Webdesigntuts +": " url ":" http://webdesign.tutsplus.com/ "," hasPremium ": false," Mobiletuts + ": " url ":" http://mobile.tutsplus.com/ "," hasPremium ": falsk
Vi kan til og med inkludere en rekke av de nyeste Premium-opplæringene for et bestemt nettsted (jeg vil bare vise Activetuts + her, og begrense det til noen få Premium, for å spare plass):
"Activetuts +": "url": "http://active.tutsplus.com/", "hasPremium": true, "premiumUrl": "http://tutsplus.com/Premium-program/active-Premium/ "" forrige premier ": [" http://tutsplus.com/join/ "," http://active.tutsplus.com/tutorials/games/create-a-space-shooter-game-in-flash-using- as3http: //tutsplus.com/join/ "," http://active.tutsplus.com/tutorials/games/obscuring-and-revealing-scenes-with-as3http://tutsplus.com/join/ "," http://active.tutsplus.com/tutorials/games/building-a-dynamic-shadow-casting-engine-in-as3http://tutsplus.com/join/ "," http://tutsplus.com/join / "], / ** SNIP! ** / "Mobiletuts +": "url": "http://mobile.tutsplus.com/", "hasPremium": false
En matrise gir mening for å notere premiene, fordi jeg jobber under forutsetningen om at en app som faktisk leser disse dataene, bare skal vise en liste over Premium-opplæringsprogrammer, i stedet for å få tilgang til dem i henhold til deres navn - så vi trenger ikke å tildele dem hver en strengnøkkel.
Vi kan ta dette enda lenger:
"Activetuts +": "url": "http://active.tutsplus.com/", "premium": "hasPremium": true, "premiumUrl": "http://tutsplus.com/Premium-program / aktiv-Premium / "," forrige premier ": [" title ":" Lag en tilpassbar Flash Quiz-applikasjon "," url ":" http://tutsplus.com/join/ ",, " title ": "Lag et Space Shooter-spill i Flash ved hjelp av AS3", "url": "http://active.tutsplus.com/tutorials/games/create-a-space-shooter-game-in-flash-using-as3http:/ /tutsplus.com/join/ ",, " title ":" Obscuring and Revealing Scenes with AS3 "," url ":" http://active.tutsplus.com/tutorials/games/obscuring-and-revealing- scener-med-as3http: //tutsplus.com/join/ ",, " title ":" Bygg en Dynamic Shadow Casting Engine i AS3 "," url ":" http://active.tutsplus.com/tutorials /games/building-a-dynamic-shadow-casting-engine-in-as3http://tutsplus.com/join/ ",, " title ":" Animere Envato Community Podcast "," url ":" http : //tutsplus.com/join/ "], / ** SNIP! ** / "Mobiletuts +": "url": "http://mobile.tutsplus.com/", "premium": "hasPremium": false
Puh! Hvis vi ønsket at vi kunne lage objekter som inneholder navnene og profiladressene til hver forfatter av hver Premium-opplæring - kan du finne ut den beste måten å gjøre det på?
Å holde arrays innenfor arrays kan være nyttig også; spesielt for spill. Dette kan være den nåværende utformingen av et Tic-Tac-Toe bord:
[[1, 2, 0], [0, 1, 0] [0, 2, 1]]
Ikke ser det? Prøv å fjerne noe mellomrom:
[[1,2,0], [0,1,0], [0,2,1]]
1
er et lite, 2
er et kryss og 0
er en tom plass. Noughts vinn! Og jeg er sikker på at du kan se hvordan noe lignende kan brukes til slagskip eller Connect 4 eller Minesweeper. For mer info om nestede arrays, sjekk ut min tidligere opplæring.
Siden JSON er så populært, er det parsere (verktøy og biblioteker som dekoder ett programmeringsspråk slik at en annen kan forstå det) og generatorer (verktøy og biblioteker som gjør det motsatte; kodes ett programmeringsspråk til et annet) tilgjengelig for de fleste programmeringsspråk. Bare søk [JSON-parser (navnet på språket ditt)]. Jeg vil markere noen som er relevante for Activetuts + lesere.
Standardbiblioteket for koding og dekoding av JSON-data i AS3 er as3corelib; se min guide til bruk av eksterne biblioteker hvis du ikke er sikker på hvordan du installerer det.
Du kan dekode en JSON-formatert streng til AS3-objekter og arrays ved å sende den til com.adobe.serialization.json.JSON.decode ()
; returverdien vil enten være en matrise eller et objekt, avhengig av JSON. Hvis du passerer falsk
som et annet argument, vil dekoderen ikke følge JSON-standarden så strengt, slik at du kan komme unna med sloppierformatering.
Du kan kode et AS3-objekt eller en array (som kan inneholde nestede objekter og arrayer) til en JSON-streng ved å sende den til com.adobe.serialization.json.JSON.encode ()
; returverdien vil være en streng.
Det er blitt annonsert at fremtidige versjoner av Flash vil inkludere innfødt JSON-parsing, så det vil snart ikke være nødvendig å bruke as3corelib for det formålet.
For å analysere JSON, bare legg til en referanse til System.Json
. Deretter:
#using System.Json; dekodet = JsonValue.Parse (jsonString); // kan være en JsonPrimitive, JsonArray eller JsonObject, avhengig av JSON bestått
Å kodes et objekt til en JSON-streng er litt mer komplisert. Du må først opprette en datakontrakt for typen objekt du ønsker å kode inn, la oss ringe vår Ting
, og selve objektet min ting
. Deretter:
#using System.Runtime.Serialization.Json; MemoryStream myStream = nytt MemoryStream (); DataContractJsonSerializer jsonEncoder = ny DataContractJsonSerializer (typeof (Thing)); jsonEncoder.WriteObject (myStream, myThing); myStream.Position = 0; StreamReader sr = ny StreamReader (myStream); kodet = sr.ReadToEnd ();
Du kan også bruke denne metoden til å dekode en JSON-streng til en bestemt klasse objekt:
#using System.Runtime.Serialization.Json; myStream.Position = 0; myOtherThing = ser.ReadObject (myStream); // du burde kaste dette som ting
For mer informasjon, se MSDN-sidene Arbeide med JSON-data og hvordan: Serialisere og deserialisere JSON-data.
Du kunne bare passere JSON-strengen til eval ()
i JavaScript, men dette er en forferdelig sikkerhetsrisiko. De fleste moderne nettlesere støtter en funksjon JSON.parse ()
, som vil analysere en JSON-streng i JavaScript-objekter, og JSON.stringify ()
, som vil slå en JavaScript-objekt eller -matrise inn i en JSON-streng.
Douglas Crockford opprettet et bibliotek for å gjøre dette i eldre nettlesere; den er tilgjengelig på github.
Det er en C # -samling kalt LitJSON som du kan bruke i Unity-prosjekter for å analysere og generere JSON. Du kan bruke dette selv om prosjektet ditt er skrevet i JavaScript eller Boo i stedet for C #.
For å dekode et Unity-objekt til en JSON-streng:
#using LitJson; streng jsonString = JsonMapper.ToJson (myObject);
For å kode en JSON-streng til et Unity-objekt av typen Thing:
#using LitJson; Thing myThing = JsonMapper.ToObject(JsonString);
LitJSON-håndboken er flott; Jeg anbefaler å lese det for mer veiledning.
JSON.org har en lang liste over biblioteker for ulike plattformer og språk - pluss, du kan søke på Google, som nevnt ovenfor;)
Det nettstedet har også noen flotte visualiseringer av hvordan JSON kan bygges, og masse detaljer går utover det jeg har forklart i denne raske introduksjonen. Sjekk det ut hvis du vil vite mer!