Большинство мобильных приложений должны уметь подключаться к внешним сервисам (существующим (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 можно узнать здесь.