C#, парсинг и прочая работа с JSON. В том числе и в .NET 2.0
Понадобилось достать несколько значений из JSON-файла, искал, чем это сделать и нашел просто офигенную библиотеку Json.NET. Это не просто парсер, это целый набор инструментов: парсер, сериализаторы, десериализаторы, конвертеры. Кроме банального вытаскивания значений, можно формировать JSON, конвертировать его в XML и XML в JSON, обращаться к объектам JSON через запрос
SelectToken
или LINQ. А можно и просто вытащить нужное значение, обращаясь к полям JSON, используя встроенные функции объектов.Несомненный плюс библиотеки в том, что даже в последней версии она поддерживает .NET Framework 2.0 Правда нельзя будет использовать синтаксис LINQ, но и без него инструментов хватает.
С помощью
JObject
и JToken
1. Подключаем библиотеку для своего Framework'а через References и в исходнике:
using Newtonsoft.Json.Linq;
2. Загружаем JSON в переменную, например из файла.
3. Парсим JSON в
JObject
:JObject JSONObj = JObject.Parse(JSONBuf);
JObject.Parse
может вызвать exception, если есть синтаксические ошибки в JSON, так что лучше поместить его в try...catch
:public static JObject ParseJSON(string JSONBuf)
{
JObject JSONObj = null;
try
{
JSONObj = JObject.Parse(JSONBuf);
}
catch (Exception ex)
{
Console.WriteLine("ERROR: " + ex.Message);
return null;
}
return JSONObj;
}
Пример реакции на ошибку синтаксиса:
Invalid character after parsing property name. Expected ':' but got: {. Path description.languages', line 15, position 9.
4. Далее, можно вытащить значение поля JSON в объект
JToken
помощью функции JSONObj.GetValue(FieldName);
, если поле со значением находится сразу в корне JSON, как, например, api_uri
в этом примере, то JToken
можно сразу преобразовать в строку с помощью функции .ToString
:JToken tok = JSONObj.GetValue("api_uri");
tok.ToString();
Однако, если поле отсутствует, то это вызовет exception:
В экземпляре объекта не задана ссылка на объект.
Этого можно избежать, отловив исключение в
try...catch
, либо проверив наличие поля функцией JObject.ContainsKey("имя_поля")
перед вызовом GetValue
, либо воспользовавшись функцией TryGetValue
вместо GetValue
Примеры кода на PasteBin
Тестовый проект
Если же нужное значение находится где-то глубоко в недрах JSON, то необходимо воспользоваться функцией
JObject.SelectToken()
Пример в официальной документации КопияКак я уже говорил, инструмент очень мощный, так что лучше начать с изучения официальной документации
Json.NET с официального сайта
Копия библиотеки v 120r3
Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2020/01/08/c-pa