JsonConvert.DeserializeObject 获取任务列表返回 Null

问题描述 投票:0回答:1

现在已经研究了几个小时,并且正在努力研究如何反序列化对 Web API 调用的响应。我们以前的版本运行良好,但端点结构在 API 更新后发生了变化,因此代码不再有效。

基本上我正在尝试提取从 API 调用的结果返回的任务,请参阅下面的从 Postman 返回的 API 调用的结构。

{
  "Version": 1,
  "Result": "Success",
  "Data": {
    "Order": {
      "Oid": "f3a3afa9-ac2b-4914-b3cb-585c761f2dfb",
      "Did": 265532,
      "Tasks": [
        {
          "Oid": "af82ce50-0587-4752-ba3b-d60dbfebe041",
          "CreatedOn": "2023-05-19T02:24:55.437Z",
          "ChangedOn": "2023-05-19T02:45:26.28Z",
          "Description": "",
          "Comment": "",
          "IsStarted": false,
          "ScheduledOn": "2023-05-19T12:14:51.507",
          "ProductionDeadline": "2023-05-21T16:00:00",
          "ScheduledStart": "2023-05-19T11:56:00",
          "ScheduledEnd": "2023-05-19T12:04:00",
          "RealStart": "0001-01-01T00:00:00",
          "RealEnd": "0001-01-01T00:00:00",
          "OrderItemPartsCount": 27,
          "CalculatedSeconds": "120",
          "IdleSeconds": "0",
          "ScheduledSeconds": 480,
          "RealSeconds": 0,
          "PercentComplete": 0,
          "HasFinishedItems": false,
          "IsCustomTask": false,
          "AppointmentType": "OrderSpecificAppointment",
          "Station": {
            "_Value": "Centurio",
            "oid": "f7f3c5fe-49f0-4a9a-b366-29c4ab990fc7"
          },
          "MasterTask": {
            "_Value": "",
            "oid": "179212f4-ff0e-465d-962c-51b7da711bb7"
          }
        },
        {
          "Oid": "72b6a0ba-cbc2-4f9b-9372-86805d40f7e3",
          "CreatedOn": "2023-05-19T02:24:55.437Z",
          "ChangedOn": "2023-05-19T02:25:28.37Z",
          "Description": "",
          "Comment": "",
          "IsStarted": false,
          "ScheduledOn": "2023-05-19T11:54:55.437",
          "ProductionDeadline": "2023-05-21T16:00:00",
          "ScheduledStart": "2023-05-19T12:11:00",
          "ScheduledEnd": "2023-05-19T13:10:00",
          "RealStart": "0001-01-01T00:00:00",
          "RealEnd": "0001-01-01T00:00:00",
          "OrderItemPartsCount": 27,
          "CalculatedSeconds": "3540",
          "IdleSeconds": "0",
          "ScheduledSeconds": 3540,
          "RealSeconds": 0,
          "PercentComplete": 0,
          "HasFinishedItems": false,
          "IsCustomTask": false,
          "AppointmentType": "OrderSpecificAppointment",
          "Station": {
            "_Value": "Twinmatic",
            "oid": "d92a32c3-0763-49d7-a8eb-77ea68afa311"
          }
        }
      ]
    }
  },
  "Details": ""
}

在以前的版本中没有“订单”元素,任何人都可以帮助展示我如何以列表的形式访问任务以便我可以处理它们吗?

问候 彼得

api json.net
1个回答
0
投票

您可以使用 https://jsonutils.com 将 JSON 转换为样板代码以反序列化您的对象。

我在你的 JSON 上使用它,这给了我一大堆类,从那里,我能够将这个非常基本的程序放在一起进行反序列化(注意你可能想通过更改变量名来清理它符合命名标准和重构等)...

using Newtonsoft.Json;

namespace StackoverflowAnswer
{
    public class Station
    {
        public string _Value { get; set; }
        public string oid { get; set; }
    }

    public class MasterTask
    {
        public string _Value { get; set; }
        public string oid { get; set; }
    }

    public class TaskResponse
    {
        public string Oid { get; set; }
        public DateTime CreatedOn { get; set; }
        public DateTime ChangedOn { get; set; }
        public string Description { get; set; }
        public string Comment { get; set; }
        public bool IsStarted { get; set; }
        public DateTime ScheduledOn { get; set; }
        public DateTime ProductionDeadline { get; set; }
        public DateTime ScheduledStart { get; set; }
        public DateTime ScheduledEnd { get; set; }
        public DateTime RealStart { get; set; }
        public DateTime RealEnd { get; set; }
        public int OrderItemPartsCount { get; set; }
        public string CalculatedSeconds { get; set; }
        public string IdleSeconds { get; set; }
        public int ScheduledSeconds { get; set; }
        public int RealSeconds { get; set; }
        public int PercentComplete { get; set; }
        public bool HasFinishedItems { get; set; }
        public bool IsCustomTask { get; set; }
        public string AppointmentType { get; set; }
        public Station Station { get; set; }
        public MasterTask MasterTask { get; set; }
    }

    public class Order
    {
        public string Oid { get; set; }
        public int Did { get; set; }
        public IList<TaskResponse> Tasks { get; set; }
    }

    public class Data
    {
        public Order Order { get; set; }
    }

    public class Response
    {
        public int Version { get; set; }
        public string Result { get; set; }
        public Data Data { get; set; }
        public string Details { get; set; }
    }

    internal class Program
    {
        static void Main(string[] args)
        {
            MainAsync().Wait();
        }

        static async Task MainAsync()
        {
            var json = "{\"Version\":1,\"Result\":\"Success\",\"Data\":{\"Order\":{\"Oid\":\"f3a3afa9-ac2b-4914-b3cb-585c761f2dfb\",\"Did\":265532,\"Tasks\":[{\"Oid\":\"af82ce50-0587-4752-ba3b-d60dbfebe041\",\"CreatedOn\":\"2023-05-19T02:24:55.437Z\",\"ChangedOn\":\"2023-05-19T02:45:26.28Z\",\"Description\":\"\",\"Comment\":\"\",\"IsStarted\":false,\"ScheduledOn\":\"2023-05-19T12:14:51.507\",\"ProductionDeadline\":\"2023-05-21T16:00:00\",\"ScheduledStart\":\"2023-05-19T11:56:00\",\"ScheduledEnd\":\"2023-05-19T12:04:00\",\"RealStart\":\"0001-01-01T00:00:00\",\"RealEnd\":\"0001-01-01T00:00:00\",\"OrderItemPartsCount\":27,\"CalculatedSeconds\":\"120\",\"IdleSeconds\":\"0\",\"ScheduledSeconds\":480,\"RealSeconds\":0,\"PercentComplete\":0,\"HasFinishedItems\":false,\"IsCustomTask\":false,\"AppointmentType\":\"OrderSpecificAppointment\",\"Station\":{\"_Value\":\"Centurio\",\"oid\":\"f7f3c5fe-49f0-4a9a-b366-29c4ab990fc7\"},\"MasterTask\":{\"_Value\":\"\",\"oid\":\"179212f4-ff0e-465d-962c-51b7da711bb7\"}},{\"Oid\":\"72b6a0ba-cbc2-4f9b-9372-86805d40f7e3\",\"CreatedOn\":\"2023-05-19T02:24:55.437Z\",\"ChangedOn\":\"2023-05-19T02:25:28.37Z\",\"Description\":\"\",\"Comment\":\"\",\"IsStarted\":false,\"ScheduledOn\":\"2023-05-19T11:54:55.437\",\"ProductionDeadline\":\"2023-05-21T16:00:00\",\"ScheduledStart\":\"2023-05-19T12:11:00\",\"ScheduledEnd\":\"2023-05-19T13:10:00\",\"RealStart\":\"0001-01-01T00:00:00\",\"RealEnd\":\"0001-01-01T00:00:00\",\"OrderItemPartsCount\":27,\"CalculatedSeconds\":\"3540\",\"IdleSeconds\":\"0\",\"ScheduledSeconds\":3540,\"RealSeconds\":0,\"PercentComplete\":0,\"HasFinishedItems\":false,\"IsCustomTask\":false,\"AppointmentType\":\"OrderSpecificAppointment\",\"Station\":{\"_Value\":\"Twinmatic\",\"oid\":\"d92a32c3-0763-49d7-a8eb-77ea68afa311\"}}]}},\"Details\":\"\"}";

            var deserializedObject = JsonConvert.DeserializeObject<Response>(json);

            // Break here            
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.