【问题标题】:Rendering JSON in a RAZOR view in ASP.NET MVC在 ASP.NET MVC 的 RAZOR 视图中呈现 JSON
【发布时间】:2014-12-23 18:16:51
【问题描述】:

我正在开发一个 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。

如果我使用result.Children(),我不会像我期望的那样得到每个键/值对。同时,result 没有我期望的 Keys 属性。我现在感觉很困。

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

【问题讨论】:

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


    【解决方案1】:

    根据JObject上的documentation,它应该实现IDictionary&lt;string, JToken&gt;。他们可能已经对接口进行了显式实现,因此您需要先将 JObject 实例转换为 IDictionary&lt;string, JToken&gt;。

    【讨论】:

      【解决方案2】:

      首先定义一些与你的 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,它接收 IList&lt;Row&gt; 作为参数并以所需的格式呈现它,所以最后你会以这样的方式结束:

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

      【讨论】:

        猜你喜欢
        • 2011-05-19
        • 2013-11-04
        • 1970-01-01
        • 2012-03-03
        • 1970-01-01
        • 2018-12-11
        • 1970-01-01
        • 2014-01-19
        • 1970-01-01
        相关资源
        最近更新 更多