首页 > 解决方案 > 解析 JSON 结果并检查状态中的指定字符串

问题描述

阅读此类最有效的方法是什么JSON file。老实说,我需要从中得到的JSON是距离。里面elements node可能有一个或多个包含distance and duration. 我需要来自每个节点的SUM所有这些值: 。例如:( ) 。我在下面展示了 3 个示例。我怎样才能做到这一点?elementdistance-text324 kmdistance in kilemeters

Morover 在上一个示例中,如果请求不好,可能会有类似"NOT_FOUND"(或除此之外的其他内容"OK")。如果在任何"status"地方会有一些与东方不同"OK"的东西,我应该得到throw Exception()

JSON 响应示例 1:

{
   "destination_addresses" : [ "Długa 50, 05-075 Warszawa, Slovakia" ],
   "origin_addresses" : [ "Wilenska 2, Zabrze, Slovakia" ],
   "rows" : [
      {
         "elements" : [
            {
               "distance" : {
                  "text" : "324 km",
                  "value" : 323619
               },
               "duration" : {
                  "text" : "3 hours 16 mins",
                  "value" : 11776
               },
               "status" : "OK"
            }
         ]
      }
   ],
   "status" : "OK"
}

在这种情况下,我应该计算为:324

JSON响应示例2:(可能有更多类似here的元素)

{
   "destination_addresses" : [ "Długa 50, 05-075 Warszawa, Slovakia" ],
   "origin_addresses" : [ "Wilenska 2, Zabrze, Slovakia" ],
   "rows" : [
      {
         "elements" : [
            {
               "distance" : {
                  "text" : "324 km",
                  "value" : 323619
               },
               "duration" : {
                  "text" : "3 hours 16 mins",
                  "value" : 11776
               },
               "status" : "OK"
            },
            {
               "distance" : {
                  "text" : "192 km",
                  "value" : 191950
               },
               "duration" : {
                  "text" : "2 hours 26 mins",
                  "value" : 8732
               },
               "status" : "OK"
            },
         ]
      }
   ],
   "status" : "OK"
}

在这种情况下,我应该计算为:516

JSON 响应示例 3:(某些状态不同于“OK”)

{
   "destination_addresses" : [ "", "", "" ],
   "origin_addresses" : [ "" ],
   "rows" : [
      {
         "elements" : [
            {
               "status" : "NOT_FOUND"
            },
            {
               "status" : "OK"
            },
            {
               "status" : "NOT_FOUND"
            }
         ]
      }
   ],
   "status" : "ERR" 
}

在这种情况下,我应该得到异常

标签: c#

解决方案


您可以使用https://json2csharp.com/根据您的 json 结构生成 C# 类。

然后安装 nuget 包https://www.nuget.org/packages/Json.Net/

那么你可以试试下面的代码:

var sampleJson = @"{


""destination_addresses"" : [ ""Długa 50, 05-075 Warszawa, Slovakia"" ],
   ""origin_addresses"" : [ ""Wilenska 2, Zabrze, Slovakia"" ],
   ""rows"" : [
      {
         ""elements"" : [
            {
               ""distance"" : {
                  ""text"" : ""324 km"",
                  ""value"" : 323619
               },
               ""duration"" : {
                  ""text"" : ""3 hours 16 mins"",
                  ""value"" : 11776
               },
               ""status"" : ""OK""
            },
            {
               ""distance"" : {
                  ""text"" : ""192 km"",
                  ""value"" : 191950
               },
               ""duration"" : {
                  ""text"" : ""2 hours 26 mins"",
                  ""value"" : 8732
               },
               ""status"" : ""OK""
            },
         ]
      }
   ],
   ""status"" : ""OK""
}";

    var obj = Newtonsoft.Json.JsonConvert.DeserializeObject<Root>(sampleJson);
    if (obj.status != "OK")
    {
        throw new Exception($"Status is: {obj.status}");
    }

    if (obj.rows.Any(r => r.elements.Any(e => e.status != "OK")))
    {
        throw new Exception("some of the elements status is not ok");
    }

    var allDistanceText = obj.rows?.Select(e => e.elements).SelectMany(e => e.Select(d => d.distance?.text));
    int sum = allDistanceText.Select(dt => dt?.Replace("km", "")?.Trim())
        .Sum(dt =>
        {
            if (int.TryParse(dt, out int results))
            {
                return results;
            }
            return 0;
        });
    sum.Dump();

推荐阅读