Универсальный метод анализа Json - PullRequest
1 голос
/ 20 апреля 2019

У меня есть этот универсальный метод, который используется для выполнения Post запроса и последующего анализа ответа следующим образом.

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");

                T1 responseModel = JsonConvert.DeserializeObject<T1>(await response.Content.ReadAsStringAsync());
                return  responseModel;
            }
            else
            {
                return await GetFailureResponseModel(response);

            }
        }
    }
}

Теперь проблема в том, что некоторые ответы на запросы Post находятся в SnakeCase , а другие - в CamelCase . Как я могу исправить эту проблему.

1 Ответ

2 голосов
/ 20 апреля 2019

Учитывая, что вы знаете во время компиляции, когда знаете snake_case и когда вам нужна стратегия по умолчанию, вы можете просто сделать это:

private Task<object> PostAsync<T1, T2>(string uri, T2 content)
{
    return PostAsync<T1, T2>(uri, content, new DefaultNamingStrategy());
}

private async Task<object> PostAsync<T1, T2>(string uri, T2 content, NamingStragy namingStrategy)
{
    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 deserializerSettings = new JsonSerializerSettings
                {
                    ContractResolver = new DefaultContractResolver
                    {
                        NamingStrategy = namingStrategy
                    }
                };

                T1 responseModel = JsonConvert.DeserializeObject<T1>(await response.Content.ReadAsStringAsync(), deserializerSettings);
                return responseModel;
            }
            else
            {
                return await GetFailureResponseModel(response);

            }
        }
    }
}

Итак, когда вам нужна стратегия по умолчанию:

await PostAsync<Some1, Some2>(uri, some2Content);

и, когда вам нужен snake_case:

await PostAsync<Some1, Some2>(uri, some2Content, new SnakeCaseNamingStrategy());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...