Поиск конкретного JToken по имени в иерархии JObject

У меня есть ответ Json от сервера, например:

{"routes" : [ { "bounds" : { "northeast" : { "lat" : 50.4639653, "lng" : 30.6325177 }, "southwest" : { "lat" : 50.4599625, "lng" : 30.6272425 } }, "copyrights" : "Map data ©2013 Google", "legs" : [ { "distance" : { "text" : "1.7 km", "value" : 1729 }, "duration" : { "text" : "4 mins", "value" : 223 }, 

И я хочу получить значение токена «текст» из

  "legs" : [ { "distance" : { "text" : "1.7 km", "value" : 1729 }, 

который представляет собой строку со значением «1,7 км».

Вопрос: есть ли встроенная функция в NewtonsoftJson lib, которая может выглядеть так:

 public string(or JToken) GetJtokenByName(JObject document, string jtokenName) 

или мне нужно реализовать какой-то рекурсивный метод, который будет искать JToken по имени во всех JTokens и JArrays в JObject?

Если вы ищете очень специфический токен и знаете путь к нему, вы можете легко перейти к нему с помощью встроенного метода SelectToken() . Например:

 string distance = jObject.SelectToken("routes[0].legs[0].distance.text").ToString(); 

Если вам нужно найти все вхождения токена с заданным именем в вашем JSON, независимо от того, где они происходят, тогда да, вам нужен рекурсивный метод. Вот то, что может сделать трюк:

 public static class JsonExtensions { public static List FindTokens(this JToken containerToken, string name) { List matches = new List(); FindTokens(containerToken, name, matches); return matches; } private static void FindTokens(JToken containerToken, string name, List matches) { if (containerToken.Type == JTokenType.Object) { foreach (JProperty child in containerToken.Children()) { if (child.Name == name) { matches.Add(child.Value); } FindTokens(child.Value, name, matches); } } else if (containerToken.Type == JTokenType.Array) { foreach (JToken child in containerToken.Children()) { FindTokens(child, name, matches); } } } } 

Вот демонстрация:

 class Program { static void Main(string[] args) { string json = @" { ""routes"": [ { ""bounds"": { ""northeast"": { ""lat"": 50.4639653, ""lng"": 30.6325177 }, ""southwest"": { ""lat"": 50.4599625, ""lng"": 30.6272425 } }, ""legs"": [ { ""distance"": { ""text"": ""1.7 km"", ""value"": 1729 }, ""duration"": { ""text"": ""4 mins"", ""value"": 223 } }, { ""distance"": { ""text"": ""2.3 km"", ""value"": 2301 }, ""duration"": { ""text"": ""5 mins"", ""value"": 305 } } ] } ] }"; JObject jo = JObject.Parse(json); foreach (JToken token in jo.FindTokens("text")) { Console.WriteLine(token.Path + ": " + token.ToString()); } } } 

Вот результат:

 routes[0].legs[0].distance.text: 1.7 km routes[0].legs[0].duration.text: 4 mins routes[0].legs[1].distance.text: 2.3 km routes[0].legs[1].duration.text: 5 mins 

Это довольно просто, используя пути javascript и метод JToken на JToken . Этот метод является довольно устрашающим и поддерживает карты диких животных, такие как:

jObject.SelectTokens("routes[*].legs[*].*.text")

Проверьте этот пример кода:

 private class Program { public static void Main(string[] args) { string json = GetJson(); JObject jObject = JObject.Parse(json); foreach (JToken token in jObject.SelectTokens("routes[*].legs[*].*.text")) { Console.WriteLine(token.Path + ": " + token); } } private static string GetJson() { return @" { ""routes"": [ { ""bounds"": { ""northeast"": { ""lat"": 50.4639653, ""lng"": 30.6325177 }, ""southwest"": { ""lat"": 50.4599625, ""lng"": 30.6272425 } }, ""legs"": [ { ""distance"": { ""text"": ""1.7 km"", ""value"": 1729 }, ""duration"": { ""text"": ""4 mins"", ""value"": 223 } }, { ""distance"": { ""text"": ""2.3 km"", ""value"": 2301 }, ""duration"": { ""text"": ""5 mins"", ""value"": 305 } } ] }]}"; } } 

И вот результат:

 routes[0].legs[0].distance.text: 1.7 km routes[0].legs[0].duration.text: 4 mins routes[0].legs[1].distance.text: 2.3 km routes[0].legs[1].duration.text: 5 mins 
  • Как десериализовать JSON с двойными именами свойств в одном и том же объекте
  • Как получить json.net для сериализации членов classа, полученных из List ?
  • Использование JSON.NET в качестве стандартного JSON-сериализатора в ASP.NET MVC 3 - возможно ли это?
  • C # JSON.NET - десериализация ответа, использующего необычную структуру данных
  • Серийный объект Json.NET с корневым именем
  • Как обрабатывать как отдельный элемент, так и массив для одного и того же свойства с помощью JSON.net
  • Удаление десериализации JSON в .NET-объект с использованием Newtonsoft (или LINQ to JSON, возможно?)
  • Указание пользовательского формата DateTime при сериализации с помощью Json.Net
  • как десериализовать JSON в IEnumerable с помощью Newtonsoft JSON.NET
  • Как разобрать объект JSON на C #, если я заранее не знаю ключ?
  • Сериализация нулевого значения в JSON.NET
  • Interesting Posts

    Как вы автоматически изменяете размер столбцов в элементе управления DataGridView? И разрешить пользователю изменять размеры столбцов в той же сетке?

    Как я могу узнать, является ли моя Windows 32-битной или 64-битной?

    Как забыть / удалить имя пользователя в Windows 8 Store – аккаунт удален

    Как отобразить текущую версию моего приложения для пользователя?

    Размер шрифта в окнах 7

    Как указать «Запуск с наивысшими привилегиями» в SchTasks?

    Числовой текстовый фильтр для целых чисел в JavaFX 8 с TextFormatter и / или UnaryOperator

    Как создать образ с ПК с Windows и запустить в Mac OS X

    Каков самый быстрый способ обмена значениями в C?

    Последствия предупреждения Windows Genuine Advantage?

    Рисование линейного графика в Excel с числовой осью x

    в блоке «using» есть SqlConnection, закрытое по возврату или исключению?

    Как показать клавиатуру номера в EditText в android?

    Как ввести ограничение нескольких столбцов с помощью аннотаций JPA?

    Ctrl + 1 и комбинации клавиш Ctrl + 2 не работают

    Давайте будем гением компьютера.