Как десериализовать результат JSON Api

Я принимаю этот результат от Api. Я не понимаю, какой класс нужно сконфигурировать, чтобы дессириализировать это. Как десериализовать результат JSON Api

"{
  \"errors\":{\"Email\": [\"This field should be filled in\"],
            \"Password\": [\"This field should be filled in\"]},
  \"title\":\"One or more validation errors occurred.\",
  \"status\":400,
  \"traceId\":\"8000006c-0002-fe00-b63f-84710c7967bb\"
}"

я пишу эти классы для десериализации

public class Content
{
    public List<Error> Errors { get; set; }
    public string Tutle { get; set; }
    public int Status { get; set; }
    public string TraceId { get; set; }
}

public class Error
{
    public string Email { get; set; }
    public string Password { get; set; }
}

Newtonsoft.Json.JsonSerializationException: 'Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1[AppStore.WPF.Services.Helpers.Error]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.

это было все позже и позже, на самом деле это не значит, как правильно написать класс

Вы уже пробовали что-нибудь? Мы не собираемся писать код за вас, но будем рады помочь, если у вас возникнут проблемы.

DavidG 30.05.2019 12:28

Я не понимаю, как написать класс, в котором нужно десериализовать. Необходимо создать 3 класса для основного, электронной почты и пароля. как использовать Ньютон я знаю.

Andrey 30.05.2019 12:39

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

DavidG 30.05.2019 12:45

Спасибо за обновление вашего вопроса, и благодаря этому у вас теперь есть ответ!

DavidG 30.05.2019 14:35
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
144
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать JSON.NET. Здесь много информации: https://www.newtonsoft.com/json/help/html/SerializingJSON.htm

Вы можете использовать динамический JObject или десериализовать конкретный класс

Это действительно должен быть комментарий.

DavidG 30.05.2019 12:28

@DavidG Я думаю, это отвечает на вопрос. Если бы вопрос был более конкретным, то и ответ был бы более конкретным. Я не буду описывать все возможные варианты, которые понятно описаны по ссылке. это было бы переписыванием документов, что не имеет смысла. Тем не менее, я уважаю ваше мнение.

JotaBe 30.05.2019 12:31

Так вы говорите, что вопрос недостаточно хорош и на него не следует отвечать? :)

DavidG 30.05.2019 12:32

@Дэвид Г. Конечно, вопрос можно и лучше, но я не считаю зазорным давать общий ответ на общий вопрос. Возможно, автор Q не знает, с чего начать, и этот указатель может дать ему некоторые идеи. Я могу ошибаться, но иногда нужно попытаться понять намерение человека, задающего вопрос. если вы считаете, что Q плохой, понизьте его. Или попросить закрыть. Не вините в этом ответ ;)

JotaBe 30.05.2019 12:36

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

DavidG 30.05.2019 12:48

@DavidG Я призываю вас найти этот общий вопрос. Вы можете найти много конкретных вопросов о сериализации JSON, но я не думаю, что так просто найти общий вопрос, чтобы пометить его как дубликат. Ничего личного против вас ;)

JotaBe 30.05.2019 12:55

В самом деле, так что иди и создай его, нам почти наверняка не помешал бы канонический C# JSON Q&A. Проблема с этим постом в том, что ОП не приложила никаких усилий. И да, ваш ответ точен, но в конечном итоге бесполезен.

DavidG 30.05.2019 12:57
Ответ принят как подходящий

Вы пытаетесь использовать:

public List<Error> Errors { get; set; }

public class Error
{
    public string Email { get; set; }
    public string Password { get; set; }
}

десериализовать:

\"errors\":{\"Email\": [\"This field should be filled in\"],
        \"Password\": [\"This field should be filled in\"]},

Посмотрите внимательно на JSON (и сообщение об ошибке); Email и Password требуют массива строк. Гипотетический ответ от API может выглядеть так:

\"errors\":{\"Email\": [\"This field should be filled in\"],
        \"Password\": [\"Password must be at least 8 characters\",
                      \"Password must contain at least one digit\"]
},

Первой попыткой исправить это может быть:

public class Error
{
    public string[] Email { get; set; }
    public string[] Password { get; set; }
}

Однако из контекста кажется вероятным, что Email и Password относятся к входным элементам, которые проверяются, и что результат может содержать другие элементы, например. PhoneNumber:

\"errors\":{\"Email\": [\"This field should be filled in\"],
        \"Password\": [\"This field should be filled in\"],
        \"PhoneNumber\": [\"This field should be filled in\"]
},

так что вы действительно хотите десериализовать его как словарь, т.е. заменить:

public List<Error> Errors { get; set; }

к:

public Dictionary<string, string[]> Errors {get; set; }

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