Понадобилось достать несколько значений из 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()
Пример в официальной документации Копия
Как я уже говорил, инструмент очень мощный, так что лучше начать с изучения официальной документации