Десериализация JSON в конечной точке POST

Я знаю, что, вероятно, делаю что-то глупое, но я этого не вижу. Я пытаюсь десериализовать этот JSON:

{
  "SendFields": 
  {
    "Category": 
    {
      "value": "Request Something"
    },
    "email": 
    {
      "value": "[email protected]"
    }
  }
}

С этой структурой классов:

public class SendFields
{
    [JsonProperty("Category")]
    public KeyValuePair<string, string> Category { get; set; }
    [JsonProperty("email")]
    public KeyValuePair<string, string> email { get; set; }

}
public class MyData
{
    [JsonProperty("SendFields")]
    public KeyValuePair<string,SendFields> SendFields { get; set; }
}

Но я продолжаю получать нули в своем KVP SendFields:

Я не знаю, что делаю не так, но, возможно, кто-нибудь здесь укажет мне на мою очевидную слепоту. :)

public class MyData { public SendFields SendFields { get; set; } }
Alexander Petrov 08.04.2024 16:57
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если вы сейчас настроили десериализацию из json, вам нужно будет настроить json аналогично этому: каждое свойство KVP представляет собой строку/строку, поэтому вам нужен ключ и значение для каждого свойства kvp.

{
  "SendFields": {
    "Category": {
      "key": "category1",
      "value": "Request Something"
    },
    "email": {
      "key": "email1",
      "value": "[email protected]"
    }
  }
}

К сожалению, я получаю этот JSON из другого приложения, а не из моего. Поэтому я пытаюсь привести структуру своего класса в соответствие с тем, что они отправляют.

Jeff Douglas 08.04.2024 17:05

если вы не можете изменить структуру json. воспользуйтесь этим сайтом json2csharp.com и вставьте туда свои данные json, и он сгенерирует для вас структуру данных C#. Основная проблема заключается в том, что тип данных KVP не будет работать для предоставленных данных json, но, используя этот сайт, вы увидите, что можете создать категорию и класс электронной почты со свойствами значения, которые будут соответствовать вашим данным json.

Dylan Hayes 08.04.2024 17:10

Использование сайта json2csharp.com сработало просто великолепно! Спасибо за помощь!

Jeff Douglas 08.04.2024 17:21

Соответствующая структура может выглядеть так:

public class MyData
{
    public SendFields SendFields { get; set; }
}

public class SendFields
{
    public ValueHolder Category { get; set; }
    public ValueHolder email { get; set; }
}

public class ValueHolder
{
    public string value { get; set; }
}

Примечания:

  • Существует соглашение о сопоставлении Dictionary<,> с объектом JSON (поддерживается как System.Text.Json, так и Json.NET от Newtonsoft), которое используется для «динамических» имен свойств (например, вы можете заменить SendFields на Dictionary<string, ValueHolder>), но не для KeyValuePair<,>, AFAIK .

  • Я бы рекомендовал называть свойства, используя стандартные соглашения (т. е. регистр Паскаля) и отмечать их соответствующими атрибутами (для Json.NET от Newtonsoft — JsonProperty и для System.Text.Json — JsonPropertyName).

  • С оригинальным SendFields следующее будет работать для Json.NET от Newtonsoft), но не для System.Text.Json с настройками по умолчанию:

    public class MyData
    {
        [JsonProperty("SendFields")]
        public SendFields SendFields { get; set; }
    }
    

    Хотя я бы все же рекомендовал не использовать здесь KeyValuePair<,>, поскольку он неправильно представляет вашу структуру JSON.

  • Рассмотрите возможность использования онлайн-инструментов, таких как https://quicktype.io/csharp или https://json2csharp.com/, для создания моделей для вашего JSON.

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