C# Json解析的一般方法

C# Json解析的一般方法,c#,json,asp.net-core,C#,Json,Asp.net Core,我有一个通用方法,用于执行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

我有一个通用方法,用于执行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);

            }
        }
    }
}
专用异步任务PostAsync(字符串uri,T2内容)
{
使用(var requestMessage=newhttprequestmessage(HttpMethod.Post,uri))
{
var json=JsonConvert.SerializeObject(内容);
使用(var stringContent=newstringcontent(json,Encoding.UTF8,“application/json”))
{
requestMessage.Content=stringContent;
HttpResponseMessage response=wait_client.SendAsync(requestMessage);
if(响应。IsSuccessStatusCode)
{
_logger.LogInformation(“请求成功”);
T1 responseModel=JsonConvert.DeserializeObject(wait response.Content.ReadAsStringAsync());
返回响应模型;
}
其他的
{
返回等待GetFailureResponseModel(响应);
}
}
}
}

现在的问题是,一些请求后响应在蛇形案例中,而另一些则在骆驼案例中。如何解决此问题

如果您在编译时知道snake_案例,并且需要默认策略,那么您可以这样做:

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

            }
        }
    }
}
private Task PostAsync(字符串uri,T2内容)
{
返回PostAsync(uri、内容、新的DefaultNamingStrategy());
}
专用异步任务PostAsync(字符串uri、T2内容、NamingStragy namingStrategy)
{
使用(var requestMessage=newhttprequestmessage(HttpMethod.Post,uri))
{
var json=JsonConvert.SerializeObject(内容);
使用(var stringContent=newstringcontent(json,Encoding.UTF8,“application/json”))
{
requestMessage.Content=stringContent;
HttpResponseMessage response=wait_client.SendAsync(requestMessage);
if(响应。IsSuccessStatusCode)
{
_logger.LogInformation(“请求成功”);
var deserializerSettings=新的JsonSerializerSettings
{
ContractResolver=新的DefaultContractResolver
{
NamingStrategy=NamingStrategy
}
};
T1 responseModel=JsonConvert.DeserializeObject(等待响应.Content.ReadAsStringAsync(),deserializerSettings);
返回响应模型;
}
其他的
{
返回等待GetFailureResponseModel(响应);
}
}
}
}
因此,当您需要默认策略时:

await PostAsync<Some1, Some2>(uri, some2Content);
wait PostAsync(uri,some2Content);
而且,当您需要snake_案例时:

await PostAsync<Some1, Some2>(uri, some2Content, new SnakeCaseNamingStrategy());
wait postsync(uri,some2Content,new SnakeCaseNamingStrategy());

@camiloTervinto我已经接受了你的答案,并且也实现了,但是你不认为在泛型方法中传递命名策略就是代码气味吗?@Shabirjan一点也不,这是一种非常常见的模式,你可以在.NET Framework源代码中找到很多