C#中HTTP响应JSON无法反序列化为Task列表的问题
问题:JSON反序列化Task列表失败,对象始终未填充
我尝试将HTTP响应中的Tasks列表转换为自定义Task类的集合,但调试时发现反序列化后的对象始终为空。
返回的完整响应JSON
{ "Version": 1, "Result": "Success", "Data": { "Tasks": [ { "Oid": "f70b1a46-690f-4637-886b-f90f035a11e8", "CreatedOn": "2022-07-15T00:07:41.553Z", "ChangedOn": "2022-07-15T03:39:58.373Z", "Subject": "233817 3693 Range Rd", "Description": "", "Comment": "", "IsStarted": true, "IsFinished": true, "IsFinalAppointment": false, "ScheduledOn": "2022-07-15T09:37:41.553", "ProductionDeadline": "0001-01-01T00:00:00", "ScheduledStart": "2022-07-15T09:45:00", "ScheduledEnd": "2022-07-15T09:50:00", "RealStart": "2022-07-15T09:45:00", "RealEnd": "2022-07-15T09:50:00", "CalculatedSeconds": 300.0000, "IdleSeconds": 0, "ScheduledDuration": "PT5M", "RealDuration": "PT5M", "Status": 2, "PercentComplete": 100, "HasFinishedItems": true, "IsCustomTask": false, "AppointmentType": "OrderSpecificAppointment", "OrderItemCount": 31, "OrderItemPartsCount": 56, "MaterialUsageTotal": 58.3280000000, "MaterialUsageTotalConverted": 58.328, "MaterialUsageNet": 46.9659000000, "MaterialUsageNetConverted": 46.9659, "MaterialUsageScrap": 11.3621000000, "MaterialUsageScrapConverted": 11.3621, "MaterialUsageTotalWeight": 263.4676, "MaterialUsageTotalWeightConverted": 263.4676, "MaterialUsageNetWeight": 212.1449000000, "MaterialUsageNetWeightConverted": 212.14490, "MaterialUsageScrapWeight": 51.3227000000, "MaterialUsageScrapWeightConverted": 51.32270, "Station": { "_Value": "Centurio", "oid": "f7f3c5fe-49f0-4a9a-b366-29c4ab990fc7" }, "Materials": [ { "_Value": "STEALTH MATTE .55 (MONUMENT†)", "oid": "4889a4f2-75c6-4fb2-b57d-d393ff495ef1", "externalID": "161539" } ], "MaterialCoils": [], "MaterialDimensions": [], "PreviousDependencies": [], "NextDependencies": [ { "_Value": "", "oid": "4699df81-4d5c-456c-904d-389a08f60a82", "start": "2022-07-17T03:37:00", "station": "Unallocated Folding Station" } ] }, { "Oid": "4699df81-4d5c-456c-904d-389a08f60a82", "CreatedOn": "2022-07-15T00:07:41.567Z", "ChangedOn": "2022-07-15T08:27:19.297Z", "Subject": "233817 3693 Range Rd", "Description": "", "Comment": "", "IsStarted": true, "IsFinished": true, "IsFinalAppointment": true, "ScheduledOn": "2022-07-15T09:37:41.567", "ProductionDeadline": "0001-01-01T00:00:00", "ScheduledStart": "2022-07-17T03:37:00", "ScheduledEnd": "2022-07-17T06:33:00", "RealStart": "2022-07-17T03:37:00", "RealEnd": "2022-07-17T06:33:00", "CalculatedSeconds": 10560.0000, "IdleSeconds": 0, "ScheduledDuration": "PT2H56M", "RealDuration": "PT2H56M", "Status": 2, "PercentComplete": 100, "HasFinishedItems": true, "IsCustomTask": false, "AppointmentType": "OrderSpecificAppointment", "OrderItemCount": 31, "OrderItemPartsCount": 56, "MaterialUsageTotal": 46.9659000000, "MaterialUsageTotalConverted": 46.9659, "MaterialUsageNet": 46.9659000000, "MaterialUsageNetConverted": 46.9659, "MaterialUsageScrap": 0.0000000000, "MaterialUsageScrapConverted": 0.0, "MaterialUsageTotalWeight": 212.1449, "MaterialUsageTotalWeightConverted": 212.1449, "MaterialUsageNetWeight": 212.1449000000, "MaterialUsageNetWeightConverted": 212.14490, "MaterialUsageScrapWeight": 0.0000000000, "MaterialUsageScrapWeightConverted": 0.00000, "Station": { "_Value": "Unallocated Folding Station", "oid": "7ce5334a-b05c-4511-be7b-1a83d2bf8d4c" }, "Materials": [ { "_Value": "STEALTH MATTE .55 (MONUMENT†)", "oid": "4889a4f2-75c6-4fb2-b57d-d393ff495ef1", "externalID": "161539" } ], "PreviousDependencies": [ { "_Value": "", "oid": "f70b1a46-690f-4637-886b-f90f035a11e8", "start": "2022-07-15T09:45:00", "station": "Centurio" } ], "NextDependencies": [] } ] }, "Details": "" }
当前使用的C#代码
public async void AppointmentsAsync(int taskScheduleID) { HttpResponseMessage taskList; using (RevSchedDataContext context = new RevSchedDataContext()) { string TimePrint = ConfigurationManager.AppSettings["TimePrint"]; schedule = (from s in context.TaskSchedules.Where(x => x.TaskScheduleID == taskScheduleID) select s).FirstOrDefault(); client.BaseAddress = new Uri("http://bendex.revroof.com.au/microsea/BendexRevBend/import/1.0/"); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml")); taskList = await client.GetAsync($"{client.BaseAddress}GetOrderScheduledTasksListJson?did=233817"); var products = await taskList.Content.ReadAsStringAsync(); var mtLists = JsonConvert.DeserializeObject<BendexTaskList>(products); } }
排查及解决方法
1. 修正Accept请求头
你请求的是GetOrderScheduledTasksListJson接口(后缀带Json),但代码里设置的Accept头是application/xml,服务器可能返回XML格式内容,导致JSON反序列化失败。把Accept头改成application/json:
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
2. 确保自定义类结构匹配JSON层级
JSON最外层包含Version、Result、Data三个字段,Data内部才是Tasks列表。你的BendexTaskList类需要对应这个层级,不能直接是Task列表。示例结构如下:
public class BendexTaskList { public int Version { get; set; } public string Result { get; set; } public TaskData Data { get; set; } public string Details { get; set; } } public class TaskData { public List<TaskItem> Tasks { get; set; } } // 你的自定义Task类(示例部分属性,需补全所有字段) public class TaskItem { public string Oid { get; set; } public DateTime CreatedOn { get; set; } public DateTime ChangedOn { get; set; } public string Subject { get; set; } // 其他属性... public Station Station { get; set; } public List<Material> Materials { get; set; } // 其他嵌套类... } public class Station { [JsonProperty("_Value")] public string Value { get; set; } public string oid { get; set; } } public class Material { [JsonProperty("_Value")] public string Value { get; set; } public string oid { get; set; } public string externalID { get; set; } }
3. 检查属性名映射
JSON中存在_Value这类特殊命名的字段,需要用[JsonProperty]特性指定映射关系,比如上面的Station和Material类中的处理。
4. 验证返回的JSON内容
调试时查看products变量的实际内容,确认服务器返回的是正确的JSON格式,没有乱码或格式错误。如果返回的是XML,说明Accept头的问题没解决。
5. 处理日期格式
JSON中的日期有两种格式(带Z和不带Z),可以配置JsonConverter来兼容:
var settings = new JsonSerializerSettings { DateParseHandling = DateParseHandling.DateTimeOffset, DateTimeZoneHandling = DateTimeZoneHandling.Utc }; var mtLists = JsonConvert.DeserializeObject<BendexTaskList>(products, settings);
内容的提问来源于stack exchange,提问作者Buda56
相关产品推荐
相关产品推荐

