c# - 解析 JSON 结果并检查状态中的指定字符串
问题描述
阅读此类最有效的方法是什么JSON file
。老实说,我需要从中得到的JSON
是距离。里面elements node
可能有一个或多个包含distance and duration
. 我需要来自每个节点的SUM
所有这些值: 。例如:( ) 。我在下面展示了 3 个示例。我怎样才能做到这一点?element
distance-text
324 km
distance 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"
}
在这种情况下,我应该得到异常
解决方案
您可以使用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();
推荐阅读
- mongodb - 为什么使用 $match 按 id 排序文档比在 mongodb 中慢?
- hyperledger-fabric - 创建频道时出现“此政策需要满足 'Writers' 子政策之一:权限被拒绝”错误
- javascript - Vue 和 Node.js 无法从“位置”导入文件模块“模块”
- angular - 如何为不同的 mat-card 元素操作 mat-card-header-text 类?
- android - 防止平移动画保持视图的原始位置
- angular - 如何在角度 8 中重置购物车详细信息
- python - numpy 中 arr[arr1,arr2] 的工作原理是什么
- c# - 使用 Entity Framework Core、oracle 11g (v11.2) 和 Scaffold-DbContext 的数据库优先
- c# - 使用反射获取元组的值
- angular - 当我使用信号器在客户端订阅方法调用时,包含集线器连接的对象的属性未定义