在C#中序列化'嵌套'JSON对象时出错

时间:2017-09-05 10:50:23

标签: c# json serialization

我正在反序列化以下JSON并且遇到类别/ WebFilters部分的问题。我希望能够遍历它,但得到

  

无法将当前JSON对象反序列化为类型 - c#'

     

CS1579 foreach语句无法对“WebFilters”类型的变量进行操作,因为“WebFilters”不包含“GetEnumerator”的公共定义

运行代码时出现

错误。最后,我需要列出每个类别中的键和值,因为我正在使用它来创建动态结果过滤器 - 我不知道在这个阶段他们将使用什么或多少过滤器。

我尝试更改我的json,但这并没有达到我想要的效果。我想我需要让WebFilters能够迭代...

感谢。

{
  "Webinars": [
    {
      "date":"2017-11-08T19:21:46Z",
      "title":"Americano",
      "desc":"Nondisp fx of prox phalanx of l mid fngr, 7thG",
      "startTime":"5:39 PM",
      "endTime":"5:19 PM",
      "categories":{
        "category":"introduction",
        "timeZone":"Europe/Stockholm",
        "language":"English"
      }
    },...

模型

public class Rootobject
{
    public Webinar[] Webinars { get; set; }
    public ELearning[] ELearning { get; set; }
}

public class Webinar
{
    public DateTime Date { get; set; }
    public string Title { get; set; }
    public string Desc { get; set; }
    public string StartTime { get; set; }
    public string EndTime { get; set; }
    public WebFilters Categories { get; set; }
}

public class WebFilters
{
    public string Category { get; set; }
    public string TimeZone { get; set; }
    public string Language { get; set; }
}

查看

@foreach (var webinar in Model.Webinars)
    {
       <li>@webinar.Title</li>
       <ul>
           @{ 
               var categories = webinar.Categories;
            }
            @foreach (var cat in categories)
            {
                <li>@cat</li>
            }
       </ul>
    }

控制器

public ActionResult Dashboard_Portal()
    {
        // Example JSON
        var webClient = new WebClient();
        var json = webClient.DownloadString(@"http://elliottjbrown.co.uk/portal/js/data.json");
        var webinars = JsonConvert.DeserializeObject<Rootobject>(json);
        return View(webinars);
    }

3 个答案:

答案 0 :(得分:2)

您的网络研讨会课程中的类别属性不是任何类型的集合,因此您无法对其进行迭代。

您可能希望将其设为集合:

public WebFilters Categories[] { get; set; }public WebFilters List<Categories> { get; set; }

如果您确实需要一组类别,则需要将部分视图配置为呈现给定的Category对象,或者您需要在for循环内提供特定的呈现。这样的事情(注意下面的代码只显示一个属性):

@foreach (var cat in categories)
            {
                <li>@cat.Category</li>
            }

如果您只希望每个网络研讨会都有一个类别,那么您需要在视图中单独引用每个属性。这是一个.NET小提琴,显示一个简单的渲染,其中Categories作为单个对象,而不是集合Simple Display Render With Non-Collection Categories Property

<ul>
    <li>@webinar.Categories.Category</li>
    <li>@webinar.Categories.TimeZone</li>
    <li>@webinar.Categories.Language</li>
</ul>

<强>更新

这是一个.NET小提琴的链接,它显示了如果您只是尝试遍历类别并显示它们可能会是什么样子:Simple Display Render With Category Collection。您会注意到Webinars的{​​{1}}和Elearning属性仍然是最初定义的数组(不是Rootobject),而List<T>确实如此没有按照其他答案中的建议实施Rootobject。没有必要进行这些改变。

现在,如果您正在寻找某种类型的 编辑页 ,用户可以从选项列表中实际选择一个类别,那就是另一个问题并且从你的OP中不清楚。

答案 1 :(得分:0)

Rootobject 类属性转换为List<>,如下所示:

public class Rootobject
{
    public List<Webinar> Webinars { get; set; }
}

更新1

注意:确保网络研讨会类中的类别IEnumerable接口或列表集合实现为{{1} } data返回一个数组。

更新2 :我已使用以下内容更新您的代码并使其正常工作:

网络研讨会课程

Json

控制器

public class Webinar
{
   public DateTime Date { get; set; }
   public string Title { get; set; }
   public string Desc { get; set; }
   public string StartTime { get; set; }
   public string EndTime { get; set; }
   public WebFilters[] Categories { get; set; } //Converted it into a collection
}

最后,视图

public ActionResult Dashboard_Portal()
{
  var webClient = new WebClient();
  var json = webClient.DownloadString(@"http://elliottjbrown.co.uk/portal/js/data.json");

  var webinars = JsonConvert.DeserializeObject<Rootobject>(json);

  return View(webinars);
}

使用屏幕截图查看输出:

Json Object Deserialization

答案 2 :(得分:-2)

根据JSON-RPC spec,json是个案敏感的。

所有c#类属性都以大写字母开头,但是你的json属性是小写字母。