Большинство мобильных приложений должны уметь подключаться к внешним сервисам (существующим (Twitter, Facebook и др.) или новым, которые разработчику также предстоит реализовать). Один из наиболее распространенных методов работы со структурированными данными в коде программы подразумевает использование формата JSON. JSON(JavaScript Object Notation) — текстовый формат обмена данными, основанный на JavaScript. Этот формат максимально доступен для чтения и анализа человеком или компьютером. JSON основан на двух следующих структурах данных:
Объекты JSON
Набор записей значений ключей, где каждое значение может быть примитивным типом или другой структурой JSON.
{ Name : "Marcos", Address : { Street : "Marcos' street", Country : "Brazil", City : "Campina Grande" } }
Массивы JSON
Список структур JSON (массивы или объекты JSON).
[ { Name : "Marcos", Country : "Brazil" }, { Name : "John", Country : "England" } ]
Для работы со строками JSON подходит множество библиотек. Эти библиотеки умеют преобразовывать строки JSON в переменные и наоборот, что делает возможным и значительно упрощает взаимодействие с внешними сервисами, использующими этот формат для обмена данными. В этой статье мы рассмотрим библиотеку Json.NET и познакомимся с принципами сериализации (конвертирования объектов C# в строки JSON), десериализации (конвертирования строк JSON в объекты C#) и поиска внутри структур JSON.
Установка библиотеки Json.NET
Библиотека Json.NET доступна в виде пакета Nuget, поэтому установить ее очень просто: щелкните по своему проекту правой кнопкой мыши и выберите Manage NuGet Packages... (Управление пакетами NuGet), введите «json.net» в поле поиска и щелкните Install (Установить).
Десериализация
Как уже было сказано ранее, десериализация (или парсинг) используется, чтобы получить структуру JSON (в виде строки) и преобразовать ее в переменные, которые можно использовать в вашем проекте.
Парсинг массива JSON
using Newtonsoft.Json.Linq; public void ParseArray() { string jsonArrayAsString = "[ { Name : \"Marcos\", Country : \"Brazil\" }, { Name : \"John\", Country : \"England\" }]"; JArray jsonArray = JArray.Parse(jsonArrayAsString); JToken jsonArray_Item = jsonArray.First; while (jsonArray_Item != null) { string name = jsonArray_Item.Value<string>("Name"); string country = jsonArray_Item.Value<string>("Country"); //Be careful, you take the next from the current item, not from the JArray object. jsonArray_Item = jsonArray_Item.Next; } }
Парсинг объекта JSON
using Newtonsoft.Json.Linq; public void ParseObject() { string jsonObjectAsString = "{ Name : \"Marcos\", Country : \"Brazil\" }"; JObject jsonObject = JObject.Parse(jsonObjectAsString); string name = jsonObject.Value<string>("Name"); string country = jsonObject.Value<string>("Country"); }
Сериализация
Сериализация используется для получения переменных C# и преобразования их в строку JSON.
Сериализация массива
public string StringifyArray(string[] names, string[] countries) { JArray jsonArray = new JArray(); for (int i = 0; i < names.Length; i++) { JObject jsonObject = new JObject(); jsonObject["Name"] = names[i]; jsonObject["Country"] = countries[i]; jsonArray.Add(jsonObject); } return jsonArray.ToString(); }
Сериализация объекта
public string StringifyObject(string name, string country) { JObject jsonObject = new JObject(); jsonObject["Name"] = name; jsonObject["Country"] = country; return jsonObject.ToString(); }
Поиск
На данном этапе вы могли подумать, что библиотека Json.NET подходит только для сериализации и десериализации объектов JSON, но не для поиска внутри этих объектов. Это не так. Для поиска в структурах JSON предусмотрены два прекрасных метода: SelectToken и SelectTokens. Вот пример:
public void Search() { string jsonObjectAsString = "{ Name : \"Marcos\", Country : \"Brazil\", Friends : [ {Name : \"John\", Country : \"England\"} , {Name : \"Chan\", Country : \"China\"} ] }"; JObject jsonObject = JObject.Parse(jsonObjectAsString); List<JToken> friendCountries = jsonObject.SelectTokens("Friends[*].Country").ToList(); for (int i = 0; i < friendCountries.Count; i++) { System.Diagnostics.Debug.WriteLine(friendCountries[i].ToString()); } }
Обратите внимание на параметр SelectTokens. Главная его задача — получить значение из поля Country (Страна) каждого друга пользователя Marcos. Параметр SelectTokens представляет собой выражение JPath. Выражения JPath — мощный инструмент для организации поиска в структурах JSON.
Несколько примеров выражений JPath:
- Friends[?(@.Name=='John')].Country — получаем название страны, указанное каждым другом пользователя John.
- Friends[0].Country — получаем название страны, указанное первым другом.
- Friends[:2] — получаем названия стран, указанные первыми двумя друзьями из списка.
Разница между SelectToken и SelectTokens заключается в том, что в первом случае возвращается только один результат. SelectToken сгенерирует исключение, если выражение JPath вернет больше одного результата.
Подробнее о выражениях JPath можно узнать здесь.