将JSON反序列化为C#类

以下是成功创建新的“工作代码”条目后从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; }


}

我正在尝试通过此调用反序列化数据:


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,但是我为实现该目标而感到困惑。


SMILET
浏览 397回答 3
3回答

杨魅力

由于您无法更改JSON的方案,并且无法设置常数的属性编号,因此建议您使用 JObjectvar jobject = JObject.Parse(json);var results = jobject["results"];var jobcodes = results["jobcodes"];var output = jobcodes.Children<JProperty>()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.Select(prop => prop.Value.ToObject<JobCode>())&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.ToList();警告:代码假定JSON始终处于正确的架构中。您还应该处理无效的架构(例如,属性不是JobCodescheme的地方)。
打开App,查看更多内容
随时随地看视频慕课网APP