JSON for Dummies (parte 2)

Abbiamo visto cosa è il formato JSON e come trasformare un oggetto di una classe custom in e da un oggetto JSON.

A questo punto vediamo un caso di utilizzo reale. Tipicamente vogliamo popolare la nostra app con dati che provengono da un servizio remoto. Prendiamo ad esempio questo sito http://www.geonames.org/export/JSON-webservices.html (ho semplicemente cercato con Bing “json sample web service”) che espone alcuni servizi REST restituendo i dati in formato JSON oppure XML.

Se con un browser apriamo l’indirizzo http://api.geonames.org/citiesJSON?north=44.1&south=-9.9&east=-22.4&west=55.2&lang=de&username=demo  otteniamo in download il file citiesJSON.json. L’idea è quella di scaricare questo file alla nostra app e deserializzare questo file per popolare un oggetto nella nostra app.

Per poter fare questo però abbiamo bisogno di definire una classe che corrisponda alla struttura dati contenuta nel file json. Potremmo analizzare il file citiesJSON.json ed estrapolare la struttura della classe da costruire. Le proprietà vengono serializzate come coppie nome:valore, dove il nome è sempre una stringa e il valore può essere un numero, una stringa o un null. Una coppia di parentesi graffe {} corrisponde ad un oggetto, una coppia di quadre [] corrisponde ad un array i cui elementi (oggetti delimitati da {}) sono separati da virgole.

Oppure possiamo utilizzare una funzione di Visual Studio molto comoda. Aprite il file JSON e copiatene il contenuto in memoria. Create una nuova classe e cancellate tutto il contenuto. Andate su Modifica –> Incolla Speciale –> Incolla JSON come classi.

Magicamente Visual Studio crea la classe (tutte le classi, in realtà) necessaria a decodificare il file json. Le proprietà della classe devono avere lo stesso nome con cui sono definite dentro il file JSON. Non è necessario che la classe per deserializzare abbia tutte le proprietà definite nel file JSON (i campi mancanti semplicemente non vengono deserializzati).

A questo punto possiamo scaricare il file. Utilizzerò HttpClient (lo trovate su Nuget). Ricordate che le chiamate a servizi remoti vanno fatte asincrone (utilizzando await) e quindi invocate all’interno di funzioni async.

HttpClient client = new HttpClient();

string outstring = await client.GetStringAsync(“http://api.geonames.org/citiesJSON?north=44.1&south=-9.9&east=-22.4&west=55.2&lang=de&username=demo”);

Rootobject deserializedObject = JsonConvert.DeserializeObject<Rootobject>(outstring);

Tutto qui. I dati che arrivano dal servizio remoto (qualunque cosa ci sia dentro), senza saper quasi nulla del servizio e dei dati, sono nella nostra app, pronti ad essere messi in binding.

Ma possiamo fare ancora qualcosa di meglio. Non siete costretti ad utilizzare i nomi delle proprietà o delle classi annidate così come sono nel file json (tutti minuscoli, per esempio). Nella definizione delle proprietà possiamo mettere tra parentesi quadre il nome della proprietà JSON che vogliamo deserializzare in modo da dare alla proprietà della nostra classe il valore che vogliamo.

[JsonProperty(“geonames”)]
public Geoname[] NomeCheVogliamo { get; set; }

Ricordiamoci di inserire using Newtonsoft.Json; nella nostra classe altrimenti non potremo usare JsonProperty.

TIP: Un tool per generare classi C# da JSON (ma anche VB.NET o Typescript) più potente di quello integrato in Visual Studio potete trovarlo qui https://jsonclassgenerator.codeplex.com/

Annunci

Un pensiero su “JSON for Dummies (parte 2)

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...