如何使用嵌套列表反序列化 Json

How to deserialize Json with nested lists

这不是我第一次将 Json 反序列化为 c# 类,但是当这些 Json 具有嵌套列表时我遇到了一些麻烦。这是返回的 Json 工作单列表:

[
  {
    "_id": "5cacdda0b4e6d128a61187ca",
    "taskInstance": [
      {
        "_id": "5cacdda0b4e6d128a61187cc"
      }
    ],
    "isRunning": false
  },
  {
    "_id": "5cacebb0b4e6d128a61187d1",
    "taskInstance": [
      {
        "_id": "5cacebb0b4e6d128a61187d3"
      }
    ],
    "isRunning": false
  }
]

这里是 C# 类: 工单

public class WorkOrder{
    public string Id { get; set; }
    public List<TaskInstance> TaskInstances { get; set; }
    public string IsRunning { get; set; }
}

和任务实例

public class TaskInstance{
    public string Id { get; set; }
}

这是我用来检查结果的代码:

JObject jsonResponse = JObject.Parse(data["data"].ToString());
string workOrderJson = jsonResponse["workOrderInstances"].ToString();
List<WorkOrder> wos = JsonConvert.DeserializeObject<List<WorkOrder>>(workOrderJson);

foreach (WorkOrder wo in wos){
    Debug.Log("WO _id: " + wo.Id);
    Debug.Log("wo.TaskInstances: "+ wo.TaskInstances);
    Debug.Log("WO isRunning: " + wo.IsRunning);
}

虽然我看到 WO._id 和 WO.isRunning 的正确值,但 wo.TaskInstances 似乎正在返回 null 或至少在我尝试访问它时抛出空引用异常.

我之前搜索过其他主题,但 none 的解决方案似乎有效。我不确定我错过了什么。谢谢你的帮助。

免责声明: data in JObject.Parse(data["data"] 看起来像这样:

{
  "data": {
    "workOrderInstances": [
      {
        "_id": "5cacdda0b4e6d128a61187ca",
        "taskInstance": [
          {
            "_id": "5cacdda0b4e6d128a61187cc"
          }
        ],
        "isRunning": false
      },
      ...
     ]
  }
}

使用这个模型:

因为你模型的问题是: JSON 属性 名称和型号 属性 代码中的名称不相同。

因此,只要您在 属性 中需要自己的自定义名称,请使用
[JsonProperty("JsonPropertyName")]

 public partial class Root
    {
        [JsonProperty("_id")]
        public string Id { get; set; }

        [JsonProperty("taskInstance")]
        public TaskInstance[] TaskInstances { get; set; }

        [JsonProperty("isRunning")]
        public bool IsRunning { get; set; }
    }

    public partial class TaskInstance
    {
        [JsonProperty("_id")]
        public string Id { get; set; }
    }

让我知道它是否适合你。