Video: JavaScript for Web Apps, by Tomas Reimers and Mike Rizzo 2024
JavaScript Object Notation (JSON) er blitt de facto når det gjelder å representere data i iOS-apper. Du kan bruke JSON til å overføre data over Internett og som format for å lagre og hente data fra lang levetid. JSON er både menneskelig lesbar og enkel for maskiner å forstå. Data i JSON kan være i en av to strukturer:
-
Et objekt bestående av et ubestilt sett med navnverdierpar. Hver navn-verdi tilsvarer et attributt for objektet. Hvert navn-verdi-par kan nestes, hvis attributten som representeres er hierarkisk i naturen.
-
Et ordnet utvalg av verdier. Hver verdi i arrayet kan være en skalar (en boolsk, streng- eller tallverdi), en gjenstand eller en matrise.
I Tic-Tac-Toe representerer JSON tilstanden til et spill. Denne tilstanden består av følgende:
-
Den nåværende spilleren (spiller 1 eller spiller 2) er representert som et heltall (0 for spiller 1 og 1 for spiller 2).
-
Spillets tilstand - enten det er aktivt eller fullført; hvis det er fullført, om det er vunnet eller tegnet og hvis vant, av hvem.
Statene er også representert som heltall, med Inaktivt vær -1, Aktiv er 0, Vann 1, og Tegn som 2.
-
Statens rutenett - det vil si hvilke symboler er til stede i hver av rutene på rutenettet. Merk at symbolene er representert som tallverdiene 0, 1 og 2, som står for henholdsvis Blank, X og O.
-
Nåværende symbol (den som skal spilles på neste trekk). Her (og bare for å variere eksemplet) representerer vi symbolet som strengen "X" eller strengen "O" eller en blank ("").
-
Spilltellingen (antall bevegelser gjort til det nåværende punktet i spillet) er representert som et heltall.
I denne koden viser vi JSON-objektet som svarer til en og aktiv Tic-Tac-Toe-spill:
{"TTTGameKeyCurrentPlayer": 0, "TTTGameKeyState": 0, "TTTGameKeyGridState": "2, 1, 2, 2, 1, 0, 1, 2, 1 "," TTTGameKeyCurrentSymbol ":" X "," TTTGameKeyPlaycount ": 8}
JSON kan enkelt kartlegge til tilgjengelige datastrukturer (for eksempel array, strukturer og objekter) i stort sett hvert programmeringsspråk. Objektformen til JSON kan enkelt kartlegge programmeringssprågem objekter eller strukturer, mens arrayformen til JSON kan kartlegge til en matrise, vektor, liste eller sekvens, i utgangspunktet uansett datastruktur kan holde en bestilt samling objekter.
I Tic-Tac-Toe blir JSON-objektet som svarer til tilstanden til spillet, kartlagt til et NSDictionary, fordi en NSDictionary-objekt også består av nestede navnverdier.Som et resultat, når du må lagre tilstanden i spillet, får du sin tilstand som et NSDictionary-objekt og deretter konverterer det til en JSON-streng.
Når du henter spillets tilstand, gjør du det motsatte - du leser i JSON-data og konverterer det til et NSDictionary-objekt og bruker deretter NSDictionary til å gjenopprette spillet til den lagrede tilstanden.
Følgende eksempel viser denne konverteringen fra et ordboksobjekt til JSON og fra JSON-dataobjektet til en streng (fra metoden saveGame i spillesesjonens visningskontroller - filer TTTGameSessionViewController.m og.h):
- (IBAction) saveGame: (id) avsender {NSDictionary * savedGameDictionary = [activeGame toDictionary]; NSError * feil; NSData * jsonData = [NSJSONSerialization dataWithJSONObject: savedGameDictionary alternativer: NSJSONWritingPrettyPrinted error: & error]; NSString * savedGameString = [[NSString alloker] initWithData: jsonData-koding: NSUTF8StringEncoding]; NSString * savedGamesFilePath = [NSHomeDirectory () stringByAppendingPathComponent: @TTTGAMESESSIONSAVEDFILEPATH]; [savedGameString writeToFile: savedGamesFilePath atomisk: JA-koding: NSUTF8StringEncoding error: NULL];}
Den viktige metoden her er i metoden dataWithJSONObject fra NSJSONSerialization-klassen.
Du kan se omvendt operasjon (det vil si fra en JSON-streng til et NSDictionary) i gjenopprettingsmetoden i samme visningskontroller:
- (IBAction) restoreGame: (id) sender {NSLog (@ "Restoring spill"); … NSError * restoreError = nil; NSMutableDictionary * savedDictionary = [NSJSONSerialization JSONObjectWithData: [savedGameString dataUsingEncoding: NSUTF8StringEncoding] alternativer: NSJSONReadingMutableContainers error: & restoreError]; activeGame = [[TTTGame alloc] initFromDictionary: savedDictionary]; TTTGameGrid * gameGrid = [activeGame getGameGrid]; hvis (! [activeGame isActive]) [boardView disableInput]; [boardView setGrid: gameGrid]; [gameView redraw];}
Her er nøkkelmetoden JSONObjectWithData, som gjør omvendt arbeidet med å skape Objective-C NSDictionary fra JSON data.