Video: Android 101 by Fred Widjaja 2024
JavaScript Object Notation (JSON) è diventato lo standard de facto in termini di rappresentazione dei dati nelle app iOS. È possibile utilizzare JSON per trasferire dati sul Web e come formato per il salvataggio e il recupero di dati di lunga durata. JSON è al contempo leggibile e facile da capire per le macchine. I dati in JSON possono essere in una di due strutture:
-
Un oggetto che comprende un insieme non ordinato di coppie nome-valore. Ogni valore di nome corrisponde a un attributo dell'oggetto. Ogni coppia nome-valore può essere annidata, nel caso in cui l'attributo che viene rappresentato sia di natura gerarchica.
-
Un array ordinato di valori. Ogni valore dell'array può essere un valore scalare (un valore booleano, stringa o numerico), un oggetto o un array.
In Tic-Tac-Toe, JSON rappresenta lo stato di un gioco. Questo stato è costituito da quanto segue:
-
Il giocatore corrente (giocatore 1 o giocatore 2) è rappresentato come un numero intero (0 per il giocatore 1 e 1 per il giocatore 2).
-
Lo stato del gioco - sia che sia attivo o completo; se è completo, se è vinto o estratto; e se vinto, da chi.
Gli stati sono anche rappresentati come interi, con Inattivo essendo -1, attivo essendo 0, vinto essendo 1, e disegnato essendo 2.
-
Lo stato della griglia - cioè, quali simboli sono presenti in ciascuno dei quadrati sulla griglia. Si noti che i simboli sono rappresentati come i valori interi 0, 1 e 2, che corrispondono rispettivamente a Vuoto, X e O.
-
Il simbolo corrente (quello che verrà riprodotto alla prossima mossa). Qui (e solo per variare l'esempio), rappresentiamo il simbolo come la stringa "X" o la stringa "O" o uno spazio ("").
-
Il conteggio dei giochi (il numero di mosse effettuate nel punto corrente nel gioco) è rappresentato come un numero intero.
In questo codice, mostriamo l'oggetto JSON corrispondente a un gioco Tic-Tac-Toe attivo:
{"TTTGameKeyCurrentPlayer": 0, "TTTGameKeyState": 0, "TTTGameKeyGridState": "2, 1, 2, 2, 1, 0, 1, 2, 1 "," TTTGameKeyCurrentSymbol ":" X "," TTTGameKeyPlaycount ": 8}
JSON si associa facilmente alle strutture di dati disponibili (come array, strutture e oggetti) in praticamente ogni linguaggio di programmazione. La forma oggetto di JSON si associa facilmente agli oggetti o alle strutture del linguaggio di programmazione, mentre la forma dell'array di JSON può essere mappata su un array, vettore, elenco o sequenza, in pratica qualunque struttura di dati può contenere una raccolta ordinata di oggetti.
In Tic-Tac-Toe, l'oggetto JSON corrispondente allo stato del gioco è mappato su un NSDictionary, poiché un oggetto NSDictionary comprende anche coppie di valori nominali nidificati.Di conseguenza, quando devi salvare lo stato del gioco, ottieni il suo stato come oggetto NSDictionary e poi lo converti in una stringa JSON.
Quando recuperi lo stato del gioco, fai il contrario: leggi i dati JSON e li converti in un oggetto NSDictionary e poi usi NSDictionary per ripristinare il gioco nello stato salvato.
L'esempio seguente mostra questa conversione da un oggetto dizionario a JSON e dall'oggetto dati JSON a una stringa (dal metodo saveGame nel controller di visualizzazione della sessione di gioco - file TTTGameSessionViewController. M e. H):
- (IBAction) saveGame: (id) sender {NSDictionary * savedGameDictionary = [activeGame toDictionary]; Errore NSError *; NSData * jsonData = [NSJSONSerialization dataWithJSONObject: savedGameDictionary opzioni: NSJSONWritingPrettyPrinted errore: & error]; NSString * savedGameString = [[NSString alloc] initWithData: codifica jsonData: NSUTF8StringEncoding]; NSString * savedGamesFilePath = [NSHomeDirectory () stringByAppendingPathComponent: @TTTGAMESESSIONSAVEDFILEPATH]; [savedGameString writeToFile: savedGamesFilePath atomicamente: YES encoding: NSUTF8StringEncoding error: NULL];}
Il metodo importante qui è nel metodo dataWithJSONObject dalla classe NSJSONSerialization.
È possibile visualizzare l'operazione inversa (ovvero, da una stringa JSON a un NSDictionary) nel metodo restoreGame nello stesso controller di visualizzazione:
- (IBAction) restoreGame: (id) sender {NSLog (@ "Ripristino gioco"); … NSError * restoreError = nil; NSMutableDictionary * savedDictionary = [NSJSONSerialization JSONObjectWithData: [savedGameString dataUsingEncoding: NSUTF8StringEncoding] options: NSJSONReadingMutableContainers error: & restoreError]; activeGame = [[TTTGame alloc] initFromDictionary: savedDictionary]; TTTGameGrid * gameGrid = [activeGame getGameGrid]; if (! [activeGame isActive]) [boardView disableInput]; [boardView setGrid: gameGrid]; [gameView redraw];}
Qui il metodo chiave è JSONObjectWithData, che esegue l'operazione inversa per la creazione di Objective-C NSDictionary dai dati JSON.