Проблема с сериализацией ответа - PullRequest
3 голосов
/ 19 апреля 2019

У меня странная проблема, может, я здесь что-то не так делаю. Поэтому я работаю над проектом WebApi с использованием .Net Core 2.2. И в этом я вызываю Api с другого сервера и анализирую ответ в этой модели.

 public class LoginResponseModel
{
    [JsonProperty(PropertyName = "token_type")]
    public string tokenType { get; set; }

    [JsonProperty(PropertyName = "access_token")]
    public string accessToken { get; set; }

    [JsonProperty(PropertyName = "expires_in")]
    public string expiresIn { get; set; }

    [JsonProperty(PropertyName = "refresh_token")]
    public string refreshtToken { get; set; }
}

Как видно из приведенной выше модели, из Api я получаю ответ в SnakeCase , а параметры моей модели в CamelCase . Когда я десериализую свой ответ Api:

 T1 responseModel = JsonConvert.DeserializeObject<T1>(await response.Content.ReadAsStringAsync());

Здесь T1 равно LoginResponseModel И он успешно анализирует Api Response в моей модели, см. Прикрепленный скриншот, enter image description here

Но когда я вызываю свой Api, который вызывает другой API, ответ которого я только что проанализировал (пример выше), ответ возвращается в SnakeCase . Смотрите скриншот enter image description here

Разъяснение Просто чтобы уточнить, мобильное приложение вызывает мой Api, т. Е. Login () , а затем мой Login Методы вызывают другой Api с другого сервера, т. Е. AuthenticateUser (...) . Таким образом, ответ AuthenticateUser - SnakeCase , который я анализирую в моем LoginResponseModel , и затем этот ответ возвращается как Login api response. Но чем я получаю ответ с SnakeCase

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

Обновление @Darkonekt Ответ помог мне, но теперь я столкнулся с другой проблемой в сериализации и десериализации. Так что это мой общий метод для PostAsync

private async Task<object> PostAsync<T1,T2>(string uri, T2 content)
    {
        using (var requestMessage = new HttpRequestMessage(HttpMethod.Post, uri))
        {
            var json = JsonConvert.SerializeObject(content);
            using (var stringContent = new StringContent(json, Encoding.UTF8, "application/json"))
            {
                requestMessage.Content = stringContent;

                HttpResponseMessage response = await _client.SendAsync(requestMessage);
                if (response.IsSuccessStatusCode)
                {
                    _logger.LogInformation("Request Succeeded");
                    var dezerializerSettings = new JsonSerializerSettings
                    {
                        ContractResolver = new DefaultContractResolver
                        {
                            NamingStrategy = new SnakeCaseNamingStrategy()
                        }
                    };
                    T1 responseModel = JsonConvert.DeserializeObject<T1>(await response.Content.ReadAsStringAsync(), dezerializerSettings);
                    return  responseModel;
                }
                else
                {
                    return await GetFailureResponseModel(response);

                }
            }
        }
    }

Поскольку этот метод является общим и будет использоваться для любого другого почтового запроса, но, как и здесь, я устанавливаю Deserializer в качестве SnakeCase, и он прекрасно работает, когда api-ответ находится в SnakeCase, но проблема возникает, когда мой другой почтовый запрос возвращает ответ в CamelCase , Я получаю нулевые значения, так как синтаксический анализ не удается. Как я могу исправить и эту проблему.

1 Ответ

1 голос
/ 19 апреля 2019

Атрибут [JsonProperty (PropertyName = "refresh_token")] является улицей с двусторонним движением.

Применяется при сериализации и десериализации.

Если вы хотите иметь другое имя при сериализации, вам понадобится ContractResolver и ваши собственные настройки.

Посмотрите на этот вопрос о стековом потоке, чтобы узнать, как это сделать: Сериализация и десериализация с разными именами свойств

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

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