Capire JSON

JSON (JavaScript Object Notation, che pronuncio "Jason" e puoi pronunciare comunque come ti piace) è un formato di dati basato su testo progettato per essere leggibile, leggero e facile da trasmettere tra un server e un client web. La sua sintassi deriva da JavaScript, da cui deriva il nome, ma può essere utilizzata nella maggior parte delle lingue, tra cui AS3 e C #.


Array

Se hai fatto molta programmazione, ti imbatterai in array prima: raccolte di elementi, ciascuno assegnato a un intero specifico.

In JSON, una matrice delle prime sei lettere dell'alfabeto sarebbe rappresentata in questo modo:

 ["a B c D e F"]

I codificatori AS3 e JavaScript troveranno molto familiare l'elenco sopra. È simile al modo C # di definire anche un array.

Come puoi probabilmente intuire, le parentesi quadre dicono "questo è un array", e le virgole sono usate per separare elementi diversi (nota che non c'è nessuna virgola dopo l'elemento finale). Supponendo che la lingua in cui si analizza il JSON utilizza matrici basate su zero (e quante lingue non, di questi tempi?), l'elemento 0 sarà "a", 1 sarà "b", 2 sarà "c" e così via.

Per rendere gli array più facili da leggere, spesso li scriviamo con nuove righe e rientri aggiuntivi:

 [ "a B c D e F" ]

Nota che non c'è ancora alcuna virgola dopo l'elemento finale, quindi ora sembra un po 'strano.

Non dobbiamo usare stringhe come elementi di un array JSON; possiamo anche usare i numeri, vero, falso, e nullo. Non esiste una digitazione rigorosa, il che significa che è possibile mescolare i tipi di valori che si utilizzano in un determinato array. Ad esempio, questo è perfettamente valido:

 ["mela", 3, 912, null, -7.2222202, "#", vero, falso]

Nota che devi usare le virgolette doppie (") per circondare tutte le tue corde; virgolette singole (') non sono consentiti. Sì, questo è il caso, anche se JavaScript ti permette di racchiudere le stringhe in entrambi i tipi di preventivo. Se si desidera utilizzare le virgolette doppie all'interno delle stringhe JSON, utilizzare \" anziché.


Oggetti

Una matrice è una raccolta di elementi in cui ciascuno è assegnato a un intero specifico. Un oggetto è una raccolta di elementi in cui ciascuno è assegnato a uno specifico stringa. Gli oggetti sono chiamati valori, e vengono chiamate le stringhe utilizzate per identificarle chiavi. Alcuni linguaggi di programmazione chiamano questo tipo di struttura dati a tabella hash o mappa di hash.

Potremmo rappresentare le età delle persone in un oggetto come questo:

 "Alan": 44, "John": 58, "Brian": 19, "Eliza": 4, "Jessie": 58

Le parentesi graffe dicono "questo è un oggetto" e, come per le matrici, separa diversi elementi. Tuttavia, gli elementi sono dati in coppie, questa volta. È più facile vedere se aggiungiamo alcune newline e indentation:

 "Alan": 44, "John": 58, "Brian": 19, "Eliza": 4, "Jessie": 58

In ogni coppia, un due punti separa la chiave (che è una stringa) dal valore (che, in questo caso, è un numero). Quando stavamo realizzando un array, non avevamo bisogno di specificare a quale numero ogni elemento era assegnato (cioè dovevamo solo specificare i valori e non le chiavi), perché erano assegnati in base all'ordine in cui erano scritti l'array.

Piuttosto che richiedere il secondo o il quinto elemento, come si farebbe quando si accede a un array, con un oggetto si richiederà l'elemento "Alan" o "Eliza".

Per rendere le cose più confuse, gli oggetti ti permettono anche di usare le stringhe come valori - non solo le chiavi. Quindi potresti avere un oggetto come questo:

 "Activetuts +": "http://active.tutsplus.com/", "Psdtuts +": "http://psd.tutsplus.com/", "Netsuts +": "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. it / "," Mobiletuts + ":" http://mobile.tutsplus.com/ "

In questo modo, per recuperare l'URL per un determinato sito Tuts +, è possibile richiederlo utilizzando il nome del sito come chiave. Tuttavia, il contrario non è vero: non è possibile utilizzare "http://cg.tutsplus.com/" per recuperare "Cgtuts +".

Le stesse regole sui diversi tipi di virgolette si applicano agli oggetti come agli array. Gli oggetti possono anche usare stringhe, numeri, vero, falso, e nullo come valori (ma solo stringhe come chiavi).


annidamento

Oggetti e matrici possono anche memorizzare altri oggetti e matrici. Questo ci permette di creare strutture di dati annidate; per esempio:

 "Activetuts +": "url": "http://active.tutsplus.com/", "hasPremium": true, "Psdtuts +": "url": "http://psd.tutsplus.com/ "," hasPremium ": true," Netsuts + ": " url ":" http://net.tutsplus.com/ "," hasPremium ": true," Aetuts + ": " url ":" http: //ae.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

Vediamolo con un po 'più di spazio bianco:

 "Activetuts +": "url": "http://active.tutsplus.com/", "hasPremium": true, "Psdtuts +": "url": "http://psd.tutsplus.com/ "," hasPremium ": true," Netsuts + ": " url ":" http://net.tutsplus.com/ "," hasPremium ": true," Aetuts + ": " url ":" http: //ae.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

Ogni oggetto contiene due campi: uno con la chiave "Url" il cui valore è una stringa contenente l'URL del sito e una con la chiave hasPremium il cui valore è un booleano vero se il sito ha una sezione Premium.

Tuttavia, non siamo limitati ad avere la stessa identica struttura per ogni oggetto nel JSON. Ad esempio, potremmo aggiungere un URL aggiuntivo che rimanda all'URL del programma Premium, ma solo per quei siti che ne hanno uno:

 "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/ net-Premium / "," Aetuts + ": " url ":" http://ae.tutsplus.com/ "," hasPremium ": true," premiumUrl ":" http://tutsplus.com/Premium- programma / ae-Premium / "," Vectortuts + ": " url ":" http://vector.tutsplus.com/ "," hasPremium ": true," premiumUrl ":" http://tutsplus.com/ Premium-program / vector-Premium / "," Audiotuts + ": " url ":" http://audio.tutsplus.com/ "," hasPremium ": true," premiumUrl ":" http: // tutsplus. it / Premium-program / audio-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 ": false 

Potremmo anche includere una serie di tutti i tutorial Premium più recenti per un dato sito (mostrerò solo Activetuts + qui, e lo limiterò ad alcuni Premi, per risparmiare spazio):

 "Activetuts +": "url": "http://active.tutsplus.com/", "hasPremium": true, "premiumUrl": "http://tutsplus.com/Premium-program/active-Premium/ "" previousPremiums ": [" 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

Un array ha senso elencare i premi, perché sto lavorando partendo dal presupposto che qualsiasi app che legge effettivamente questi dati mostrerà semplicemente un elenco di tutorial Premium, piuttosto che doverli accedere in base al loro nome - quindi non è necessario assegnare loro una chiave di stringa.

Potremmo fare ancora di più:

 "Activetuts +": "url": "http://active.tutsplus.com/", "premium": "hasPremium": true, "premiumUrl": "http://tutsplus.com/Premium-program / active-Premium / "," previousPremiums ": [" title ":" Crea un'applicazione Flash Quiz personalizzabile "," url ":" http://tutsplus.com/join/ ",, " title ": "Crea un gioco sparatutto spaziale in Flash usando 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- scene-with-as3http: //tutsplus.com/join/ ",, " title ":" Creazione di un motore di Dynamic Shadow Casting in AS3 "," url ":" http://active.tutsplus.com/tutorials /games/building-a-dynamic-shadow-casting-engine-in-as3http://tutsplus.com/join/ ",, " title ":" Animazione del podcast della community Envato "," url ":" http : //tutsplus.com/join/ "], / ** SNIP! ** / "Mobiletuts +": "url": "http://mobile.tutsplus.com/", "premium": "hasPremium": false

Accidenti! Se volessimo poter creare oggetti che contengono i nomi e gli URL del profilo di ciascun autore di ciascun tutorial Premium, puoi capire il modo migliore per farlo?

Anche mantenere gli array all'interno degli array può essere utile; in particolare per i giochi. Questo potrebbe essere il layout corrente di una tavola Tic-Tac-Toe:

 [[1, 2, 0], [0, 1, 0] [0, 2, 1]]

Non vederlo? Prova a rimuovere alcuni spazi bianchi:

 [[1,2,0], [0,1,0], [0,2,1]]

1 è un nulla, 2 è una croce e 0 è uno spazio vuoto. I trionfi vincono! E sono sicuro che puoi vedere come qualcosa di simile potrebbe essere usato per Battleships o Connect 4 o Minesweeper. Per maggiori informazioni sugli array annidati, controlla il mio tutorial precedente.


Utilizzo di JSON con piattaforme diverse

Dal momento che JSON è così popolare, ci sono parser (strumenti e librerie che decodificano un linguaggio di programmazione in modo che un altro possa capirlo) e generatori (strumenti e librerie che fanno il contrario, codificano un linguaggio di programmazione in un altro) disponibili per la maggior parte dei linguaggi di programmazione. Cerca solo [Parser JSON (nome della tua lingua]. Ne evidenzierò alcuni che sono rilevanti per i lettori di Activetuts +.


Per Flash e AS3

La libreria standard per la codifica e la decodifica dei dati JSON in AS3 è as3corelib; consulta la mia guida sull'utilizzo di librerie esterne se non sei sicuro di come installarlo.

Puoi decodificare una stringa formattata JSON su oggetti e array AS3 passandola a com.adobe.serialization.json.JSON.decode (); il valore di ritorno sarà un array o un oggetto, a seconda del JSON. Se passi falso come seconda argomentazione, il decoder non seguirà lo standard JSON in modo così rigoroso, quindi è possibile ottenere una formattazione più scadente.

È possibile codificare un oggetto o una matrice AS3 (che può contenere oggetti e matrici nidificati) in una stringa JSON passandola a com.adobe.serialization.json.JSON.encode (); il valore restituito sarà una stringa.

È stato annunciato che le versioni future di Flash includeranno l'analisi JSON nativa, quindi non ci sarà più bisogno di usare as3corelib per questo scopo.


Per .NET (incluso Silverlight)

Per analizzare JSON, aggiungi un riferimento a System.Json. Poi:

 #using System.Json; decodificato = JsonValue.Parse (jsonString); // potrebbe essere un JsonPrimitive, JsonArray o JsonObject, a seconda del JSON passato

Per codificare un oggetto in una stringa JSON è un po 'più complicato. È necessario innanzitutto creare un contratto dati per il tipo di oggetto che si desidera codificare; chiamiamo il nostro Cosa, e l'oggetto reale myThing. Poi:

 #using System.Runtime.Serialization.Json; MemoryStream myStream = new MemoryStream (); DataContractJsonSerializer jsonEncoder = new DataContractJsonSerializer (typeof (Thing)); jsonEncoder.WriteObject (myStream, myThing); myStream.Position = 0; StreamReader sr = new StreamReader (myStream); encoded = sr.ReadToEnd ();

Puoi anche utilizzare questo metodo per decodificare una stringa JSON su una specifica classe di oggetti:

 #using System.Runtime.Serialization.Json; myStream.Position = 0; myOtherThing = ser.ReadObject (myStream); // dovresti lanciarlo come Cosa

Per ulteriori informazioni, consultare le pagine MSDN Utilizzo dei dati JSON e Procedura: serializzare e deserializzare i dati JSON.


Per JavaScript (e quindi app HTML 5)

tu poteva basta passare la stringa JSON a eval () in JavaScript, ma questo è un terribile rischio per la sicurezza. La maggior parte dei browser moderni supporta una funzione JSON.parse (), che analizzerà una stringa JSON in oggetti JavaScript e JSON.stringify (), che trasformerà un oggetto o array JavaScript in una stringa JSON.

Douglas Crockford ha creato una libreria per farlo nei vecchi browser; è disponibile su github.


Per l'unità

C'è un assembly C # chiamato LitJSON che puoi usare nei tuoi progetti Unity per analizzare e generare JSON. Puoi usare questo anche se il tuo progetto è scritto in JavaScript o Boo piuttosto che C #.

Per decodificare un oggetto Unity su una stringa JSON:

 #using LitJson; string jsonString = JsonMapper.ToJson (myObject);

Per codificare una stringa JSON su un oggetto Unity di tipo Cosa:

 #using LitJson; Cosa è myhing = JsonMapper.ToObject (JsonString);

Il manuale LitJSON è fantastico; Raccomando di leggerlo per ulteriori indicazioni.


Per altre lingue

JSON.org ha una lunga lista di librerie per diverse piattaforme e lingue - inoltre, puoi cercare su Google, come menzionato sopra;)

Quel sito ha anche alcune grandi visualizzazioni su come costruire JSON, e molti dettagli vanno oltre ciò che ho spiegato in questa breve introduzione. Controllalo se vuoi saperne di più!