我正在开发一个 ASP.NET MVC应用程序。我的应用正在与第三方 REST 服务交互。该服务正在我的 MVC 应用程序的控制器中调用。该服务的结果如下所示:
{
"group@odata.type": "#Collection",
"group": [],
"class@odata.type": "#Collection",
"class":[
{ "total": 111, "value": "A" },
{ "total": 222, "value": "B" },
{ "total": 333, "value": "C" }
],
"status@odata.type": "#Collection",
"status": [
{ "total": 1, "value": "Open" },
{ "total": 20, "value": "Closed" },
{ "total": 51, "value": "Unknown" }
]
}
服务的结果存储在我的模型中名为 Results
的 JObject
属性中。对于每个数组,我正在尝试打印出其键名。然后,我想浏览并打印出数组中的每个值和总计。换句话说,上面的 JSON 如下所示:
group
class
A - 111
B - 222
C - 333
status
Open - 1
Closed - 20
Unknown - 51
为了做到这一点,我认为有以下几点。
foreach (var result in Model.Results)
{
<div></div>
<ul>
@foreach (var subResult in result.?)
{
<li style="padding-left:8px;">@(subResult["value"] + " - " + subResult["total"])</li>
}
</ul>
}
显然,上述内容是行不通的。我的挑战是,我不明白如何:
- 循环访问 JObject 中的键/值对。
- 确定该值是 JArray 还是另一个 JObject。
如果我使用 result.Children()
,我不会像我期望的那样获得每个键/值对。同时,result
没有我期望的Keys
财产。此刻我感到非常卡住。
感谢您提供的任何帮助。节日快乐!
根据JObject
的文档,它应该实现IDictionary<string, JToken>
。他们可能已经完成了接口的显式实现,因此您需要先将 JObject 实例强制转换为IDictionary<string, JToken>
。
首先定义一些与 Json 响应对应的类:
public class ServiceResponce
{
public IList<Row> Group{get;set;}
public IList<Row> Class{get;set;}
public IList<Row> Status{get;set;}
}
public class Row
{
public int Total {get;set;}
public string Value {get;set;}
}
您可以使用 Json.Net 或其他一些库将 Json 反序列化为对象:
JsonConvert.DeserializeObject<ServiceResponce>(json);
因此,您的模型最终将具有ServiceResponce
属性:
public ServiceResponce Result{get;set;}
您可以轻松浏览 ServiceResponce 程序:
<div></div>
<ul>
foreach (var result in Model.Result.Group)
{
<li style="padding-left:8px;">@(result.Value + " - " + result.Total)</li>
}
<ul>
为了使其更简洁,请编写一个 HtmlHelper,该 HtmlHelper 接收IList<Row>
作为参数并以所需的格式呈现它,因此最后您将以类似以下内容结尾:
@YourHelper(Model.Result.Group)
@YourHelper(Model.Result.Class)
@YourHelper(Model.Result.Status)