在ASP.NET MVC的RAZOR视图中呈现JSON

时间:2014-12-23 18:16:51

标签: asp.net-mvc json json.net

我正在开发一个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" }
  ]  
}

服务结果存储在名为JObject的模型中的Results属性中。对于每个阵列,我都试图打印出它的关键名称。然后,我想查看并打印出数组中的每个值和总数。换句话说,上面的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>
}                    

显然上述情况不起作用。我的挑战是,我不明白如何:

  1. 循环访问JObject中的键/值对。
  2. 确定该值是JArray还是其他JObject。
  3. 如果我使用result.Children(),我不会像我期望的那样获得每个键/值对。与此同时,result没有像我期望的Keys属性。我现在感到很困惑。

    感谢您提供的任何帮助。节日快乐!

2 个答案:

答案 0 :(得分:1)

根据JObject上的documentation,它应该实现IDictionary<string, JToken>。他们可能已经完成了接口的显式实现,因此您需要首先将JObject实例强制转换为IDictionary<string, JToken>

答案 1 :(得分:0)

首先定义一些与您的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>

为了使它更清晰,可以编写一个接收IList<Row>作为参数的HtmlHelper并以所需的格式呈现它,所以最后你会得到类似的结果:

@YourHelper(Model.Result.Group)
@YourHelper(Model.Result.Class)
@YourHelper(Model.Result.Status)