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)。