如何从 json 对象循环访问某个令牌



我需要在 c# (winforms) 中读取一个 json 文件,但我在这样做时遇到了一些麻烦。

这是文件的简单内容:它包含 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;
    }
}

在此代码之后,shortest 包含 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++;
}

在此之后,变量令牌仍然包含所有路由的所有分支。

试试这个。它会让你循环通过最短腿的步骤

        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;
                }
            }
        }

相关内容

  • 没有找到相关文章

最新更新