我正在反序列化以下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);
}
答案 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);
}
使用屏幕截图查看输出:
答案 2 :(得分:-2)
根据JSON-RPC spec,json是个案敏感的。
所有c#类属性都以大写字母开头,但是你的json属性是小写字母。