В настоящее время я пытаюсь проанализировать некоторые данные JSON. Это формат строки JSON, которую я получаю:
{
"messageFormat": "JSON",
"messageArguments": [
{
"signUpModal": {
"Id": 0,
"FirstName": null,
"LastName": null,
"UserName": null,
"Email": "<email address>",
"RoleId": null,
"Password": "<password>",
"IsActive": null,
"SecretKey": null,
"Token": null,
"Role": null,
"RolePermissions": null,
"ImagePath": null,
"CurrentDate": null
}
}
]
}
Я создал два класса для соответствия этой структуре данных:
public class Parameter
{
public string messageFormat { get; set; }
public List<SignUpModal> messageArguments { get; set; }
}
public class SignUpModal
{
public int? Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string UserName { get; set; }
public string Email { get; set; }
public int? RoleId { get; set; }
public string Password { get; set; }
public bool? IsActive { get; set; }
public int? SecretKey { get; set; }
public string Token { get; set; }
public string Role { get; set; }
public string RolePermissions { get; set; }
public string ImagePath { get; set; }
public string CurrentDate { get; set; }
}
Теперь, когда я использую var param = JsonConvert.DeserializeObject<Parameter>(tempData);, ошибка не возникает, и в поле MessageFormat правильно отображается «JSON». Поле MessageArguments также содержит экземпляр класса SignUpModal, однако все поля в классе SignUpModal являются null.
Я пытался изменить структуры классов различными способами, но тогда данные даже не будут десериализоваться. Я не уверен, почему данные для поля messageArguments не извлекаются правильно. Любая помощь/предложения будут очень признательны.
Сравните свой код с тем, что он генерирует: json2csharp.com





Вы пропускаете урок. Добавьте этот класс в свою модель:
public class MessageArgument
{
public SignUpModal signUpModal { get; set; }
}
Затем измените эту строку в классе Parameter:
public List<SignUpModal> messageArguments { get; set; }
К этому:
public List<MessageArgument> messageArguments { get; set; }
Несоответствие договора. Вы должны либо изменить JSON на:
{
"messageFormat": "JSON",
"messageArguments": [
{
"Id": 0,
"FirstName": null,
"LastName": null,
"UserName": null,
"Email": "<email address>",
"RoleId": null,
"Password": "<password>",
"IsActive": null,
"SecretKey": null,
"Token": null,
"Role": null,
"RolePermissions": null,
"ImagePath": null,
"CurrentDate": null
}]
}
Или изменить сущность
public class Parameter
{
public string messageFormat { get; set; }
public List<MessageArgument> messageArguments { get; set; }
}
class MessageArgument {
public SignUpModal SignUpModal {get; set;}
}
public class SignUpModal
{
public int? Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string UserName { get; set; }
public string Email { get; set; }
public int? RoleId { get; set; }
public string Password { get; set; }
public bool? IsActive { get; set; }
public int? SecretKey { get; set; }
public string Token { get; set; }
public string Role { get; set; }
public string RolePermissions { get; set; }
public string ImagePath { get; set; }
public string CurrentDate { get; set; }
}
Как отметил Мэтт Берланд, проблема в messageArguments.
Если вы также используете ресурс, предоставленный Робертом Харви, вы также увидите разницу в созданной вами структуре объектов.
Parameter должен состоять из
public string messageFormat { get; set; }
public List<MessageArgument> messageArguments { get; set; }
Вам также понадобится
{
public SignUpModal signUpModal { get; set; }
}
Похоже, вы используете неправильный генератор классов. Я скопировал ваш json в jsonutils, и он дал мне эту модель:
public class SignUpModal
{
public int Id { get; set; }
public object FirstName { get; set; }
public object LastName { get; set; }
public object UserName { get; set; }
public string Email { get; set; }
public object RoleId { get; set; }
public string Password { get; set; }
public object IsActive { get; set; }
public object SecretKey { get; set; }
public object Token { get; set; }
public object Role { get; set; }
public object RolePermissions { get; set; }
public object ImagePath { get; set; }
public object CurrentDate { get; set; }
}
public class MessageArgument
{
[JsonProperty("signUpModal")]
public SignUpModal SignUpModal { get; set; }
}
public class Parameter
{
[JsonProperty("messageFormat")]
public string MessageFormat { get; set; }
[JsonProperty("messageArguments")]
public IList<MessageArgument> MessageArguments { get; set; }
}
Обратите внимание, что этот генератор кода позволяет вам использовать PascalCase для свойств, добавляя атрибут JsonProperty
Теперь, если вы десериализуете свой ввод, вы увидите ненулевые Email и Password:
var input = "{\r\n \"messageFormat\": \"JSON\",\r\n \"messageArguments\": [\r\n {\r\n \"signUpModal\": {\r\n \"Id\": 0,\r\n \"FirstName\": null,\r\n \"LastName\": null,\r\n \"UserName\": null,\r\n \"Email\": \"<email address>\",\r\n \"RoleId\": null,\r\n \"Password\": \"<password>\",\r\n \"IsActive\": null,\r\n \"SecretKey\": null,\r\n \"Token\": null,\r\n \"Role\": null,\r\n \"RolePermissions\": null,\r\n \"ImagePath\": null,\r\n \"CurrentDate\": null\r\n }\r\n }\r\n ]\r\n}";
var result = JsonConvert.DeserializeObject<Parameter>(input);
Console.WriteLine(result.MessageArguments.First().SignUpModal.Email); // will print "<email address>"
Ваш объект внутри массива
messageArgumentsне являетсяSignUpModal, это объект со свойствомsignUpModal, которое являетсяSignUpModal