为了账号安全,请及时绑定邮箱和手机立即绑定

将JSON反序列化为C#类

将JSON反序列化为C#类

C#
SMILET 2019-11-02 10:41:08
以下是成功创建新的“工作代码”条目后从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,但是我为实现该目标而感到困惑。
查看完整描述

3 回答

?
杨魅力

TA贡献1811条经验 获得超6个赞

由于您无法更改JSON的方案,并且无法设置常数的属性编号,因此建议您使用 JObject


var jobject = JObject.Parse(json);


var results = jobject["results"];

var jobcodes = results["jobcodes"];


var output = jobcodes.Children<JProperty>()

                     .Select(prop => prop.Value.ToObject<JobCode>())

                     .ToList();

警告:代码假定JSON始终处于正确的架构中。您还应该处理无效的架构(例如,属性不是JobCodescheme的地方)。


查看完整回答
反对 回复 2019-11-02
  • 3 回答
  • 0 关注
  • 396 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号