Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 57 di 59
  • livello principiante
Indice lezioni

Le richieste JSON

Invocare un web service con Json
Invocare un web service con Json
Link copiato negli appunti

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.

Ti consigliamo anche