Я принимаю этот результат через 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: 'Невозможно десериализовать текущий объект JSON (например, {"name": "value"}) в тип "System.Collections.Generic.List`1 [AppStore.WPF.Services.Helpers.Error]', поскольку тип требует массив JSON (например, [1,2,3]) для правильной десериализации.

Это было позже и позже, случайно не означает, как правильно писать класс

1
Andrey 30 Май 2019 в 13:22

2 ответа

Лучший ответ

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

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; }
2
Joe 30 Май 2019 в 11:53

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

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

-1
JotaBe 30 Май 2019 в 10:27