首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在JSON中动态分析子节点

在JSON中动态分析子节点
EN

Stack Overflow用户
提问于 2022-05-20 17:55:12
回答 1查看 99关注 0票数 -1

我有一个反序列化对象,我想动态地循环这个对象来返回相关的结果。响应包看起来是这样的:

代码语言:javascript
复制
{"RatingResponse":
 {"Success":"true",
  "Message":"",
  "QuoteID":"57451",
  "LoadNum":"57451",
  "Rates":
    {"Rate":
        [
            {"SCAC":"test1",
             "CarrierName":"TEST1",
             "TransitTime":"1",
             "ServiceLevel":"D",
             "TotalCost":"1,031.82",
             "ThirdPartyCharge":"1,031.82",
             "Accessorials":
                {"Accessorial":
                    [
                        {"Code":"400",
                        "Cost":"1,655.55",
                        "Description":"Freight"
                        },
                        
                        {"Code":"DSC",
                        "Cost":"-952.77",
                        "Description":"Discount"
                        },
                        
                        {"Code":"FUE",
                        "Cost":"329.04",
                        "Description":"Fuel Surcharge"
                        }
                    ]
                },
                "QuoteNumber":""
            },
            
            {"SCAC":"test2",
            "CarrierName":"TEST2",
            "TransitTime":"1",
            "ServiceLevel":"D",
            "TotalCost":"1,031.82",
            "ThirdPartyCharge":"1,031.82",
            "Accessorials":
                {"Accessorial":
                    [
                        {"Code":"400",
                        "Cost":"1,655.55",
                        "Description":"Freight"
                        },
                        
                        {"Code":"DSC",
                        "Cost":"-952.77",
                        "Description":"Discount"
                        },
                        
                        {"Code":"FUE",
                        "Cost":"329.04",
                        "Description":"Fuel Surcharge"
                        }
                    ]
                },
                "QuoteNumber":""
            }
        ]
    },
    "AverageTotalCost":"1,031.82"
   }
 }

我已经对响应数据进行了分析,这样可以使用的信息就更少了,特别是因为我只需要附加成本。解析后的响应看起来就像

代码语言:javascript
复制
 [
 {
"SCAC": "test1",
"CarrierName": "TEST1",
"TransitTime": "1",
"ServiceLevel": "D",
"TotalCost": "1,031.82",
"ThirdPartyCharge": "1,031.82",
"Accessorials": {
  "Accessorial": [
    {
      "Code": "400",
      "Cost": "1,655.55",
      "Description": "Freight"
    },
    {
      "Code": "DSC",
      "Cost": "-952.77",
      "Description": "Discount"
    },
    {
      "Code": "FUE",
      "Cost": "329.04",
      "Description": "Fuel Surcharge"
    }
  ]
},
"QuoteNumber": ""
 },
 {
"SCAC": "test2",
"CarrierName": "TEST2",
"TransitTime": "1",
"ServiceLevel": "D",
"TotalCost": "1,031.82",
"ThirdPartyCharge": "1,031.82",
"Accessorials": {
  "Accessorial": [
    {
      "Code": "400",
      "Cost": "1,655.55",
      "Description": "Freight"
    },
    {
      "Code": "DSC",
      "Cost": "-952.77",
      "Description": "Discount"
    },
    {
      "Code": "FUE",
      "Cost": "329.04",
      "Description": "Fuel Surcharge"
    }
  ]
},
"QuoteNumber": ""
}
]

我面临的问题是,我永远不会知道在响应数据中将返回多少费率项目,也不知道附加成本的确切数额。我希望捕获每个速率的比率子节点计数和辅助子节点计数。到目前为止我的情况是这样的。

代码语言:javascript
复制
   Root rootObject = Newtonsoft.Json.JsonConvert.DeserializeObject<Root>(responseFromServer);
   //rate stores the parsed response data
   JArray rate = (JArray)JObject.Parse(responseFromServer)["RatingResponse"]["Rates"]["Rate"];
   var rate2 = rate.ToString();

   //this for loop works as expected. it grabs the number of Rate nodes (in this example, 2)
   for (int i = 0; i < rate.Count(); i++)
       {
          dynamic test2 = rate[i];
          //this is where I'm struggling
          dynamic em = (JArray)JObject.Parse(test2)["Accessorials"]["Accessorial"].Count();
             for (int j = 0; j < em; j++)
                 {
                    string test3 = test2.Accessorials.Accessorial[j].Cost;
                    System.IO.File.AppendAllText(logPath, Environment.NewLine + test3 + Environment.NewLine);
                        }
                }

我对格式和奇怪变量名称的错误表示歉意--我显然还在测试这个功能,所以我一直在使用随机变量。

我正在挣扎的地方(正如上面所指出的)是进入辅助节点来计算它的数组中有多少项。我想我可以解析第一个数组(从SCAC数据开始)并扩展到访问节点,但是我没有任何运气。

任何帮助都是非常感谢的,特别是因为我对这种类型的代码并不熟悉,并且花了一天的大部分时间来解决这个问题。

EN

回答 1

Stack Overflow用户

发布于 2022-05-20 19:03:41

你可以试试这个

代码语言:javascript
复制
var rates = (JArray)JObject.Parse(json)["RatingResponse"]["Rates"]["Rate"];
var costs = rates.Select(r => new
    {
        CarrierName = r["CarrierName"],
        Costs = ((JArray)((JObject)r["Accessorials"])["Accessorial"])
                            .Where(r => (string)r["Description"] != "Discount")
                            .Select(r => (double)r["Cost"]).Sum()
    }).ToList();

结果

代码语言:javascript
复制
[
  {
    "CarrierName": "TEST1",
    "Costs": 1984.59
  },
  {
    "CarrierName": "TEST2",
    "Costs": 1984.59
  }
]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72323033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档