2016-03-08 4 views
0

Мне нужно прочитать json-файл в C# (winforms), но у меня возникают некоторые проблемы.Как пропустить определенный токен из объекта json?

это является simplyfied содержимое файла: содержит 2 маршрута, каждый маршрут имеет одну ногу и одну или несколько стадий

{ 
"routes" : [ 
    { 
    "legs" : [ 
     { 
      "distance" : { 
       "text" : "246 km", 
       "value" : 246047 
      }, 
      "steps" : [ 
       { 
       "distance" : { 
        "text" : "2.4 km", 
        "value" : 2383 
       }, 
       }, 
       { 
       "distance" : { 
        "text" : "3.7 km", 
        "value" : 3697 
       }, 
       }, 
      ], 
     } 
    ], 
    }, 
    { 
    "legs" : [ 
     { 
      "distance" : { 
       "text" : "280 km", 
       "value" : 280048 
      }, 
      "steps" : [ 
       { 
       "distance" : { 
        "text" : "2.4 km", 
        "value" : 2383 
       }, 
       }, 
       { 
       "distance" : { 
        "text" : "6.9 km", 
        "value" : 3697 
       }, 
       }, 
      ], 
     } 
    ], 
    } 
], 
} 

Что мне нужно сделать, это:
1. найти короткий маршрут (это мне удалось сделать)
2. петлю через этапы кратчайшему пути, это я не знаю, как

мой код для нахождения кратчайшего маршрута заключается в следующем:

JObject o = JObject.Parse(content); 
JToken token = null; 

decimal distance = 0; 
decimal shortest = 0; 
JToken routes = o.SelectToken("routes"); 

foreach (JToken tempToken in routes.Children()) 
{ 
    distance = (decimal)tempToken.SelectToken("legs[0].distance.value")/1000; 
    if (distance < shortest || shortest == 0) 
    { 
     shortest = distance; 
     token = tempToken.SelectToken("legs[0]").First; 
    } 
} 

После этого кода, кратчайший содержит 246047, так что это работает. Но токен переменной содержит все ноги для этого файла, а не только первый отрезок кратчайшего маршрута.
Я надеялся, что у вас будет указатель на переменную, который содержит только шаги для этапа кратчайшего маршрута, поэтому я мог бы пропустить этот токен.
Возможно, у меня все это неправильно, и это просто не работает?

Как я могу пройти через кратчайшие пути?

EDIT: Я пробовал другой подход, но с теми же результатами. Это мой второй подход:

int index = 0; 
foreach (JToken tempToken in routes.Children()) 
{ 
    distance = (decimal)tempToken.SelectToken("legs[0].distance.value")/1000; 
    if (distance < shortest || shortest == 0) 
    { 
     shortest = distance; 
     token = o.SelectToken("routes[" + index.ToString() + "].legs[0]"); 
    } 
    index++; 
} 

После этого переменная лексема еще содержит все ноги всех маршрутов.

ответ

1

Попробуйте это. Это позволит вам цикл через шаги кратчайшему ноги

 foreach (JToken tempToken in routes.Children()) 
     { 
      distance = (decimal)tempToken.SelectToken("legs[0].distance.value")/1000; 
      if (distance < shortest || shortest == 0) 
      { 
       shortest = distance; 
       IEnumerable<JToken> steps = tempToken["legs"].Children()["steps"].Children(); 

       foreach (JToken step in steps) 
       { 
        var thisStep = step; 
       } 
      } 
     } 
+0

наклоняет скомпилировать «Еогеасп (JToken шаг с шагом)», компилятором сай: Еогеасп оператор не может работать с переменными «варом» типа, потому что «вар» делает не содержит общедоступного определения для «GetEnumerator» – GuidoG

+0

обновленный ответ вам нужен IEnumerable шагов вместо шагов var –

+0

Он работает, спасибо – GuidoG

Смежные вопросы