以下是成功创建新的“工作代码”条目后从REST API获得的(略)简化的响应。我需要将响应反序列化为某些类,但是我很困惑。
作为参考,我在.NET 3.5(在SQL Server 2008 R2中的SSIS脚本中运行)中使用JSON.NET尝试反序列化。这是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<JobCode>(jsonResponse);
其中jsonResponse是上面输出的代码。 当我执行代码时,“ newResource”总是返回为空- 这并不意外,因为我知道数据中实际上有多个作业代码,并且此代码试图将其反序列化为单个JobCode对象。我尝试创建一个名为“ JobCodes”的新类,如下所示:
class JobCodes { [JsonProperty("jobcodes")] public List<JobCode>_JobCodes { get; set; } }
然后我尝试调用此命令:
newResource = JsonConvert.DeserializeObject<JobCodes>(jsonResponse);
但是问题仍然存在-我的返回对象为null。我认为让我失望的是标识符“ 1”和“ 2”的存在。我不知道如何在我的对象设计和/或JSON.NET类/属性属性(例如[JsonObject],[JsonProperty]等)的使用中考虑它们的存在。
当我通过JSON2CSharp运行JSON数据时,它构造了一些看起来很奇怪的类,因此尚未证明它太有效。我已经用几个不同的验证器验证了JSON,并且都将其检出- 我只是不知道我在这里缺少什么。
最终,我想从JSON数据返回一个List,但是我为实现该目标而感到困惑。
您的问题是双重的:
Dictionary<string, T>
List<T>
使您的班级像这样:
class RootObject { [JsonProperty("results")] public Results Results { get; set; } } class Results { [JsonProperty("jobcodes")] public Dictionary<string, JobCode> 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<RootObject>(json);
在这里工作演示