You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 01:15:51