Десериализация данных JSON

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

Ваш объект внутри массива messageArguments не является SignUpModal, это объект со свойством signUpModal, которое является SignUpModal

Matt Burland 01.04.2019 22:13

Сравните свой код с тем, что он генерирует: json2csharp.com

Robert Harvey 01.04.2019 22:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
126
4

Ответы 4

Вы пропускаете урок. Добавьте этот класс в свою модель:

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>"

Другие вопросы по теме