将JSON反序列化为C#类
下面是我在成功创建新“作业代码”条目后从REST API获得的(略微)精简响应。 我需要将响应反序列化为某些类,但我很难过。
作为参考,我在.NET 3.5中使用JSON.NET(在SQL Server 2008 R2中的SSIS脚本中运行)来尝试反序列化。 这是JSON – 我显然无法控制它,因为它来自其他人的API:
{ "results":{ "jobcodes":{ "1":{ "_status_code":200, "_status_message":"Created", "id":444444444, "assigned_to_all":false, "billable":true, "active":true, "type":"regular", "name":"1234 Main Street - Jackson" }, "2":{ "_status_code":200, "_status_message":"Created", "id":1234567890, "assigned_to_all":false, "billable":true, "active":true, "type":"regular", "name":"4321 Some Other Street - Jackson" } } } }
在我的C#代码中,我确实定义了一个“JobCode”类,它只将JSON值部分映射到属性 – 我对返回给我的所有数据都不感兴趣:
[JsonObject] class JobCode { [JsonProperty("_status_code")] public string StatusCode { get; set; } [JsonProperty("_status_message")] public string StatusMessage { get; set; } [JsonProperty("id")] public string Id {get; set;} [JsonProperty("name")] public string Name { get; set; } //------------------------------------------------------------------------------- // Empty constructor for JSON serialization support //------------------------------------------------------------------------------- public JobCode() { } }
我试图通过这个调用反序列化数据:
newResource = JsonConvert.DeserializeObject(jsonResponse);
其中jsonResponse是上面输出的代码。
当我执行代码时,“newResource”总是返回null – 这并不意外,因为我知道数据中实际上有多个作业代码,而且这段代码试图将其反序列化为单个JobCode对象。 我尝试创建一个名为“JobCodes”的新类,如下所示:
class JobCodes { [JsonProperty("jobcodes")] public List_JobCodes { get; set; } }
然后我试着这样说:
newResource = JsonConvert.DeserializeObject(jsonResponse);
但问题仍然存在 – 我的返回对象为null。 我认为,让我失望的是“1”和“2”标识符的存在。 我不知道如何解释它们在我的对象设计中的存在和/或JSON.NET类/属性属性的使用,如[JsonObject],[JsonProperty]等。
当我通过JSON2CSharp运行JSON数据时,它构造了一些奇怪的类,所以这并没有certificate太有效。 我已经用几个不同的validation器validation了JSON,它们都检查了 – 我只是不知道我在这里缺少什么。
最后,我想从JSON数据中返回一个List,但是我很难知道我需要做些什么来实现这一点。
你的问题是双重的:
- 您没有在根级别定义的类。 类结构需要匹配整个 JSON,你不能只从中间反序列化。
- 每当你有一个可以改变键的对象时,你需要使用
Dictionary
。 普通class级不适用于此;List
也不会。
让你的课程像这样:
class RootObject { [JsonProperty("results")] public Results Results { get; set; } } class Results { [JsonProperty("jobcodes")] public Dictionary JobCodes { get; set; } } class JobCode { [JsonProperty("_status_code")] public string StatusCode { get; set; } [JsonProperty("_status_message")] public string StatusMessage { get; set; } [JsonProperty("id")] public string Id { get; set; } [JsonProperty("name")] public string Name { get; set; } }
然后,反序列化如下:
RootObject obj = JsonConvert.DeserializeObject(json);
在这里工作演示
优秀的答案!
对于那些可能需要更多JSON类配置帮助的人,请尝试: http : //json2csharp.com/#
自动生成类的一种很好的方法!
甚至更容易,在VS中,Goto:
编辑 – >选择性粘贴 – >粘贴为JSON类
因为你不能改变JSON的方案,你不能设置常量的属性,我建议你使用JObject
var jobject = JObject.Parse(json); var results = jobject["results"]; var jobcodes = results["jobcodes"]; var output = jobcodes.Children() .Select(prop => prop.Value.ToObject()) .ToList();
警告:代码假定JSON始终处于正确的架构中。 您还应该处理无效的模式(例如,属性不是JobCode
方案)。