#c# #arrays #json.net
#c# #массивы #json.net
Вопрос:
У меня есть этот объект Json:
{ "ComplementoCartaPorte": [ { "RFCImportador": "IJD840224QD2", "Pedimentos": [ { "NumPedimento": "80034680000518", "Referencia": "REFPEDIMENTO1IN", "Remesa": 1 }, { "NumPedimento": "80034680000528", "Referencia": "REFPEDIMENTO2A1", "Remesa": 0 } ], "Archivos": { "FolioFiscal": "287d57c7-9132-4234-9268-28e984e7cdf1", "PDF": "PD94", "XML": "PD94" } }, { "RFCImportador": "MJD960223MV9", "Pedimentos": [ { "NumPedimento": "80034680000519", "Referencia": "REFPEDIMENTO3IN", "Remesa": 1 }, { "NumPedimento": "80034680000520", "Referencia": "REFPEDIMENTO4A1", "Remesa": 0 } ], "Archivos": { "FolioFiscal": "587d57c7-9133-4234-9268-28e984e7cdg7", "PDF": "AM92", "XML": "AM92" } } ] }
Я пытаюсь де-сериализовать его в объект C# этого класса:
// Top level class public class ComplementoCartaPorte { // Only one field, an array public Complemento[] Complemento { get; set; } } // Array elements of "Complemento" field public class Complemento { public string RFCImportador { get; set; } // Array Field public Pedimento[] Pedimentos { get; set; } public Archivo Archivos { get; set; } } // Array elements of "Pedimentos" field public class Pedimento { public string NumPedimento { get; set; } public string Referencia { get; set; } public int Remesa { get; set; } } public class Archivo { public string FolioFiscal { get; set; } public string PDF { get; set; } public int XML { get; set; } }
Я пытаюсь десериализовать вот так (C#):
ComplementoCartaPorte comp = JsonConvert.DeserializeObjectlt;ComplementoCartaPortegt;(json_string);
Результирующий объект «comp» имеет тип «ComplementoCartaPorte», но он имеет только одно свойство типа «Complemento», которое является нулевым. Я ожидал, что это будет массив «Дополняющих» объектов с данными.
Может кто-нибудь, пожалуйста, пролить свет на это? Большое спасибо.
Ответ №1:
Используйте список lt; ComplementoCartaPorte gt; вместо ComplementoCartaPorte
Listlt;ComplementoCartaPortegt; comp = JsonConvert .DeserializeObjectlt;Rootgt;(json_string).ComplementoCartaPorte;
классы
public class Pedimento { public string NumPedimento { get; set; } public string Referencia { get; set; } public int Remesa { get; set; } } public class Archivos { public string FolioFiscal { get; set; } public string PDF { get; set; } public string XML { get; set; } } public class ComplementoCartaPorte { public string RFCImportador { get; set; } public Listlt;Pedimentogt; Pedimentos { get; set; } public Archivos Archivos { get; set; } } public class Root { public Listlt;ComplementoCartaPortegt; ComplementoCartaPorte { get; set; } }
Комментарии:
1. Это сработало как волшебство, большое спасибо! Кроме того, благодаря вашему ответу я теперь могу лучше понять, как эта штука работает. Очень признателен.
Ответ №2:
В этом случае может быть полезно разбить json выше, чтобы понять, почему это происходит.
Начнем с {}
того, что у нас есть безымянный объект. Это наш объект-оболочка / корневой объект.
На этом объекте у нас есть свойство, ComplementoCartaPorte
. Этот объект содержит массив объектов, обозначенных []
символом with {},{}
внутри.
Но эта структура не соответствует нашим существующим классам. ComplementoCartaPorte
обладает свойством, которое является свойством массива, называемым Complemento
Complemento
объектами
Если мы хотим, чтобы эти объекты были десериализованы, Complemento
нам нужно немного изменить json.
{ "ComplementoCartaPorte": { "Complemento": [ { "RFCImportador": "IJD840224QD2", "Pedimentos": [ { "NumPedimento": "80034680000518", "Referencia": "REFPEDIMENTO1IN", "Remesa": 1 }, { "NumPedimento": "80034680000528", "Referencia": "REFPEDIMENTO2A1", "Remesa": 0 } ], "Archivos": { "FolioFiscal": "287d57c7-9132-4234-9268-28e984e7cdf1", "PDF": "PD94", "XML": "PD94" } }, { "RFCImportador": "MJD960223MV9", "Pedimentos": [ { "NumPedimento": "80034680000519", "Referencia": "REFPEDIMENTO3IN", "Remesa": 1 }, { "NumPedimento": "80034680000520", "Referencia": "REFPEDIMENTO4A1", "Remesa": 0 } ], "Archivos": { "FolioFiscal": "587d57c7-9133-4234-9268-28e984e7cdg7", "PDF": "AM92", "XML": "AM92" } } ] }
}
Обратите внимание на корректировку объекта для свойства ComplementoCartaPorte добавление свойства для Complemento
после открытия ComplementoCartaPorte
объекта.
Затем мы можем добавить следующий класс в качестве нашей оболочки
public class Wrapper { public ComplementoCartaPorte ComplementoCartaPorte { get; set; } } Wrapper comp = JsonConvert.DeserializeObjectlt;Wrappergt;(json_string);
Комментарии:
1. Потрясающий ответ, спасибо. Я новичок в JSON и JSON. Сеть и ваш ответ очень помогли мне лучше понять, как это работает. К сожалению, мне не разрешено изменять JSON, хотя мне разрешено изменять классы C#. Я пойду по этому пути теперь, когда лучше понимаю предмет. Еще раз спасибо.