json newtonsoft:反序列化包含字符串列表的Object

我对这个json有以下问题:

{ "EVTS": { "EVT": [ { "ID": "123456", "KEY1" : "somekey", "CATEG": [ "cat1", "cat2", "cat3" ] } ]} } 

这个c#类:

 public class myClass{ public string ID { get; set; } public string KEY1 { get; set; } public list CATEG { get; set; } } public class ESObject1 { [JsonProperty("EVT")] public List EVT { get; set; } } public class ESObject0 { [JsonProperty("EVTS")] public ESObject1 EVTS { get; set; } } 

}

在这里我称之为解串器:

 ESObject0 globalobject = JsonConvert.DeserializeObject(json); 

但是这最后一个代码不起作用,我抛出了这个exception: System.ArgumentException: Could not cast or convert from System.String to System.Collections.Generic.List 1 [System.String]。

而不是list我使用string []并且只有string似乎没有用。

我该如何正确地反序列化这个对象呢。

谢谢。

这个工作示例说明了似乎没有任何明显的问题。

 using Newtonsoft.Json; using System; using System.Collections.Generic; public class myClass { public string ID { get; set; } public string KEY1 { get; set; } public List CATEG { get; set; } } public class ESObject1 { [JsonProperty("EVT")] public List EVT { get; set; } } public class ESObject0 { [JsonProperty("EVTS")] public ESObject1 EVTS { get; set; } } class Program { static void Main() { string json = @"{ ""EVTS"": { ""EVT"": [ { ""ID"": ""123456"", ""KEY1"": ""somekey"", ""CATEG"": [ ""cat1"", ""cat2"", ""cat3"" ] } ] } }"; ESObject0 globalobject = JsonConvert.DeserializeObject(json); foreach (string item in globalobject.EVTS.EVT[0].CATEG) { Console.WriteLine(item); } } } 

也许你刚刚给反序列化器输入了一个错误的json值,它看起来不像你问题中显示的那样。 顺便说一下,在你的问题中显示的那个是无效的JSON,因为你在KEY1属性声明之后缺少了一个。


更新:

现在您已经展示了真正的JSON(来自http://donnees.ville.quebec.qc.ca/Handler.ashx?id=69&f=JSON ),看来有一行CATEG不是字符串数组但是简单的字符串:

 ""CATEG"": ""Conférence"" 

现在这是一个非常糟糕的设计,因为它们混合了数组和简单的属性。 我担心为了处理这种情况,你需要使用JObject并通过测试实际的底层类型来提取你需要的信息。

例如:

 var obj = JObject.Parse(json); var events = (JArray)obj["EVTS"]["EVT"]; foreach (JObject evt in events) { var categories = evt["CATEG"]; if (categories is JArray) { // you've got a list of strings so you can loop through them string[] cats = ((JArray)categories) .Select(x => x.Value()) .ToArray(); } else { // you've got a simple string string cat = categories.Value(); } } 

我已经多次这样做了很多令人头痛的问题。 我的建议是使用json输出并使用类似于此的工具为您编写类( http://json2csharp.com/ )。

然后查看任何可以为空的变量,并在需要的地方添加可空类型(例如,使用int?for int)。