2016-03-08 54 views
0

我需要在c#(winforms)中讀取json文件,但我遇到了一些麻煩。如何從json對象中遍歷某個標記?

這是該文件的內容simplyfied: 它包含兩條路線,每條路線有一條腿和一個或多個步驟

{ 
"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,所以這個工程。 但可變令牌包含此文件的所有支腿,而不僅僅是最短路線的第一條支腿。
我希望最終得到一個只包含最短路徑腿的步驟的可調整令牌,所以我可以循環這個令牌。
也許我有這一切都錯了,它只是不這樣工作?

如何循環執行最短路徑的步驟?

編輯: 我嘗試了另一種方法,但結果相同。 這是我的第二個方法:

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

的步驟不能編譯「的foreach(JToken一步步)」,編譯器最高審計機關:foreach語句無法在類型「變種」的變量操作,因爲「變種」呢不包含'GetEnumerator'的公共定義 – GuidoG

+0

更新的答案您需要IEnumerable 步驟而不是var步驟 –

+0

它的工作原理,謝謝 – GuidoG