Главная » Silverlight » Службы, возвращающие данные JSON

0

Синтаксис JSON (JavaScript Object Notation — объектная нотация JavaScript) часто используется как упрощенная альтернатива JavaScript. В Silverlight рекомендуется ис­пользовать SOAP, однако JSON все еще поддерживается в целях обратной совмести­мости. Для десериализации данных JSON в объектное представление нужно писать код вручную.

Единственный случай, когда необходима сериализация JSON, возникает при работе с веб-службой, возвращающей только данные JSON и не предоставляющей альтерна­тивную версию на основе SOAP. Впрочем, и в этом случае вы можете выбрать способ обработки данных: средствами JSON или с помощью объекта XDocument. Кроме того, платформа Silverlight предоставляет два существенно разных способа синтаксической обработки данных JSON. Вы можете десериализовать данные JSON (как в следующем примере) или применить выражение LINQ таким же способом, как к содержимому XML. В данной главе обработка содержимого JSON средствами LINQ не рассматривается. Подробнее об этом можно узнать в документации Silverlight SDK или по такому адресу:

www.blogs.msdn.com/mikeormond/archive/2008/08/21/linq-to-json.aspx

Перед обработкой данных JSON нужно добавить в проект ссылки на три допол­нительные сборки: System.Runtime.Serialization.dll, System.ServiceModel.dll и System.ServiceModel.Web.dll.

Десериализация кода JSON выполняется так же, как кода XML с помощью клас­са XmlSerializer. Необходим класс, структура которого соответствует структу­ре данных JSON. Когда подходящий класс существует, можно применить объект DataContractJsonSerializer для преобразования данных JSON в экземпляр класса или наоборот.

Например, служба поиска изображений сайта Yahoo! (www.developer.yahoo.com/ search/image/Vl/imageSearch.html) предоставляет интерфейс JSON. Возвращаемые им данные выглядят следующим образом.

{"ResultSet":{ "totalResultsAvailable":"957841", "totalResultsReturned":10, "firstResultPosition":1,

"Result":[

{

"Title":"tree_frog.jpg", "Summary":"Red-Eyed Tree Frog",

"Uri":"http:\A/www.thekidscollege.com\/images\WWW /animals\/redeyetree_frog.jpg",

Ь

{

"Title":"tree_frog_large-thumb.jpg", "Summary":"Before I came back in though I gotWWW

another shot of the frog.", "Uri":"http:\/\/www.silveriafamily.com\/blog\WWW /john\/treefrog.jpg",

}

]

}}

Данные состоят из пар "имя-значение", сгруппированных в классы (с помощью фи­гурных скобок) и массивы (с помощью квадратных скобок). Для преобразования этих данных необходимы следующие классы: отдельный класс для каждого результата поис­ка (в JSON — Result); класс для всего набора результатов (ResultSet); высокоуровневый класс для набора результатов поиска. Указанным классам можно присвоить любые име­на, однако имена свойств должны точно совпадать с именами в представлении JSON, включая регистр букв. Классы не обязательно должны содержать все свойства, приве­денные в представлении JSON. Ненужные свойства можно опустить.

Ниже приведены необходимые классы. Имена свойств, основанных на представле­нии JSON, выделены полужирным шрифтом.

public class SearchResults {

public SearchResultSet ResultSet;

}

public class SearchResultSet <

public int totalResultsAvailable f get; set; } public int totalResultsReturned { get; set; } public SearchResult[] Result { get; set; }

}

public class SearchResult

{

public string Title {get; set;} public string Summary { get; set; } public string Uri { get; set; }

}

Эти классы можно использовать для десериализации результатов поиска. Десериализация выполняется в два этапа. Сначала нужно создать экземпляр класса DataContract JsonSerializer, задав сериализуемый или десериализуемый тип в каче­стве аргумента конструктора.

DataContractJsonSerializer serializer =

new DataContractJsonSerializer(typeof(SearchResults));

Затем нужно вызвать метод ReadOb j ect () для десериализации данных JSON или ме­тод WriteObject для их создания.

SearchResults results = (SearchResults)serializer.ReadObject(jsonData);

На рис. 20.5 показан пример страницы Silverlight, задающей поиск изображений по ключевому слову.

Рис. 20.5. Поиск изображений с помощью веб-службы Yahoo!

Ниже приведены обработчики щелчка на кнопке Получить данные и события завершения.

private void cmdGetData_Click(object sender,

RoutedEventArgs e)

{

WebClient client = new WebClient(); Uri address = new Uri( "http://search.yahooapis.com/ImageSearchService/WWW

VI/imageSearch?" + "appid=YahooDemo&query=" +

HttpUtility.UrlEncode(txtSearchKeyword.Text) + "&output=json");

client.OpenReadCompleted += client_OpenReadCompleted; client.OpenReadAsync(address) ;

}

private void client_OpenReadCompleted(object sender,

OpenReadCompletedEventArgs e)

{

DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(SearchResults)); SearchResults results =

(SearchResults)serializer.ReadObject(e.Result);

lblResultsTotal.Text = "Возвращено " + results.ResultSet.totalResultsAvailable + " результатов."; lblResultsReturned.Text = "Всего " + results.ResultSet.totalResultsReturned + " результатов."; gridResults.ItemsSource = results.ResultSet.Result;

}

Источник: Мак-Дональд, Мэтью. Silverlight 3 с примерами на С# для профессионалов. : Пер. с англ. —- М. : ООО «И.Д. Вильяме», 2010. — 656 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии