Строка JSON не будет десериализоваться в указанный тип

У меня есть следующий фрагмент кода, который отправляет запрос Http POST на сервер. Сервер возвращает ответ на запрос 400 Bad вместе с объектом ошибки в виде Json:

namespace MyApp.Shared.Dtos.Response
{
    public class ErrorItem
    {
        public string Message { get; set; }
        public string Tag { get; set; }
    }

    public class ErrorDto
    {
        public string Title { get; set; }
        public List<ErrorItem> Errors { get; set; } = new();
    }
}

namespace Accounting.Web.Services
{
    public interface IHttpService
    {
        Task<T> Get<T>(string uri);
        Task<T> Post<T>(string uri, object value, bool addBearerToken = false);
        public ErrorDto Error { get; set; }
    }

    public class HttpService: IHttpService
    {
        private HttpClient _httpClient;
        public ErrorDto Error { get; set; }

        public HttpService(HttpClient httpClient)
        {
            _httpClient = httpClient;
            _stateService = stateService;
        }

        public async Task<T> Post<T>(string uri, object value)
        {
            var request = new HttpRequestMessage(HttpMethod.Post, uri);
            request.Content = new StringContent(JsonSerializer.Serialize(value), Encoding.UTF8, "application/json");
            return await sendRequest<T>(request, addBearerToken);
        }

        private async Task<T> sendRequest<T>(HttpRequestMessage request)
        {
            using var response = await _httpClient.SendAsync(request);
            
            if (response.StatusCode == System.Net.HttpStatusCode.BadRequest)
            {
                var result = await response.Content.ReadAsStringAsync();
                Error = JsonSerializer.Deserialize<ErrorDto>(result);
                //..
            } 
            else
            {
                //..
            }            
        }
    }
}

Результат правильно получает следующий ответ от сервера в виде строки JSON:

{"title":"Неверное имя пользователя или пароль","ошибки":[]}

И я могу подтвердить, проверив результат var, он имеет указанное выше значение.

Однако, похоже, он не десериализуется в класс ErrorDto, как можно было бы ожидать: Ошибка = JsonSerializer.Deserialize (результат);

Но я просто не вижу проблем с кодом, вроде он должен работать.

*** ОБНОВЛЯТЬ ***

Код API моего сервера возвращает JSOn, используя тот же класс DTO (это общий класс), используя следующий код:

[HttpPost("authenticate")]
public ActionResult Authenticate(AuthenticateRequest loginRequest)
{
    var auth = _userService.Authenticate(loginRequest);
    ErrorDto error = new()
    {
        Title = "Username or password is incorrect"
    };
    if (auth.user == null || auth.token == null)
    {
        return BadRequest(error);
    }
    return Ok(auth.user.ConvertToDto(auth.token));
}
Стоит ли изучать 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
0
173
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

По умолчанию System.Text.Jsonчувствителен к регистру. Есть несколько способов справиться с этим, например, предоставив соответствующий JsonSerializerOptions:

var json = @"{""title"":""Username or password is incorrect"",""errors"":[]}";
var errorDto = JsonSerializer.Deserialize<ErrorDto>(json, new JsonSerializerOptions
{
    PropertyNameCaseInsensitive = true
});

Или пометить свойства соответствующими JsonPropertyNameAttribute:

public class ErrorItem
{
    [JsonPropertyName("message")]
    public string Message { get; set; }
    [JsonPropertyName("tag")]
    public string Tag { get; set; }
}

public class ErrorDto
{
    [JsonPropertyName("title")]
    public string Title { get; set; }

    [JsonPropertyName("errors")]
    public List<ErrorItem> Errors { get; set; } = new();
}

УПД

Из документа Как настроить имена и значения свойств с помощью System.Text.Json:

Примечание
В сети по умолчанию используется верблюжий регистр.

Если вы хотите переключиться с верблюжьего регистра на политику именования, используемую для DTO, вы можете сделать следующее:

builder.Services.AddControllers()
    .AddJsonOptions(opts => opts.JsonSerializerOptions.PropertyNamingPolicy = null);

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

Musaffar Patel 27.11.2022 20:37

Причина @MusaffarPatel, поскольку в этом документе указано: «По умолчанию в Интернете используется верблюжий регистр».

Guru Stron 27.11.2022 20:49

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