将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,但是我很难知道我需要做些什么来实现这一点。

你的问题是双重的:

  1. 您没有在根级别定义的类。 类结构需要匹配整个 JSON,你不能只从中间反序列化。
  2. 每当你有一个可以改变键的对象时,你需要使用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方案)。