Как десериализовать Json с помощью вложенных списков - PullRequest
0 голосов
/ 02 мая 2019

Я не первый раз десериализую Json в классы c #, но у меня возникают некоторые проблемы, когда эти Json имеют вложенные списки.Вот возвращенный Json списка workOrders:

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

и вот классы C #: WorkOrder

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

и TaskInstance

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, кажется, возвращает ноль или бросает бросокисключение нулевой ссылки всякий раз, когда я пытаюсь получить к нему доступ.

Я искал другие темы раньше, но ни одно из решений, похоже, не работает.Я не уверен, что мне не хватает.Спасибо за вашу помощь.

Отказ от ответственности: необработанные данные в JObject.Parse (data ["data"] выглядит следующим образом:

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

1 Ответ

0 голосов
/ 02 мая 2019

Используйте эту модель:

Потому что проблема с вашей моделью: Имя свойства 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; }
    }

Дайте мне знать, если это работает для вас.

...