Modifichiamo l'esempio fatto nella lezione precedente, in modo da invocare il servizio con JSON, per analizzare le classi di Silverlight dedicate a questo formato.
In Silverlight, un generico oggetto JSON è rappresentato dalla classe astratta JsonValue
, contenuto nel namespace System.Json
dell'omonimo assembly. Questa classe espone il metodo Load
che permette di deserializzare uno Stream JSON in un oggetto JsonValue
, proprio ciò di cui abbiamo bisogno.
Iniziamo aggiungendo i parametri &format=json&nojsoncallback=1
all'URI di richiesta. In questo caso abbiamo bisogno di uno Stream
, quindi modifichiamo il codice della ricerca impostando la callback per l'evento OpenReadAsyncCompleted
e richiamiamo il metodo OpenReadAsync
della classe WebClient
.
private void btnSearch_Click(object sender, RoutedEventArgs e) { var searchText = txtSearch.Text; string url = String.Format(baseUrl, searchText, apiKey); WebClient client = new WebClient(); client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted); client.OpenReadAsync(new Uri(url)); }
Passiamo alla modifica del metodo di callback. Lasciamo intatta la gestione dell'errore, e deserializziamo lo Stream
tramite il metodo Load
della classe JsonValue
.
private void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) { if (e.Error != null) { MessageBox.Show(e.Error.Message); return; } JsonValue jsonPhotos = JsonValue.Load(e.Result); var flickrPhotos = from JsonObject photo in jsonPhotos["photos"]["photo"] select new FlickrPhoto { Id = (string)photo["id"], Owner = (string)photo["owner"], Secret = (string)photo["secret"], Server = (string)photo["server"], Farm = (int)photo["farm"], Title = (string)photo["title"] }; lstPhotos.ItemsSource = flickrPhotos.ToList(); }
JsonValue
è una collezione dictionary
di proprietà/valori, quindi per leggere il valore di una proprietà di un dato trasferito possiamo usare JsonValue
come un dictionary.
Tramite LINQ to JSON
iteriamo l'elenco delle foto contenute nella risposta e generiamo una lista di oggetti FlickrPhoto.
L'interfaccia utente non subirà alcuna modifica, quindi lanciando l'applicazione otteniamo un risultato analogo al precedente.