.net HttpClient with custom JsonConverter



我正在使用 .NET 的 HttpClient 向返回一些 JSON 数据的请求,该 Web API 要求客户端进行一些自定义反序列化。 为此,我制作了自己的JsonConverter,但是我不知道如何让ReadAsAsync<T>方法拾取转换器的存在。

我现在通过使用ReadAsStringAsync读取响应,然后将该字符串传递给JsonConvert.DeserializeObject来解决我的问题,但似乎应该有一个更优雅的解决方案。

这是我的代码:

public PrefsResponse GetAllPrefs(string sid) {
    HttpClient client = CreateHttpClient(null, sid);
    var response = client.GetAsync("api/sites/" + sid).Result;
    // TODO : find a way to hook custom converters to this...
    // return response.Content.ReadAsAsync<PrefsResponse>().Result;
    var stringResult = response.Content.ReadAsStringAsync().Result;
    return JsonConvert.DeserializeObject<PrefsResponse>(stringResult, new PrefClassJsonConverter());
}

这是我能做的最好的事情,还是有更优雅的方式?

这也是我创建 HttpClient 的地方,如果这是我需要连接它的地方:

        private HttpClient CreateHttpClient(CommandContext ctx, string sid) {
        var cookies = new CookieContainer();
        var handler = new HttpClientHandler {
            CookieContainer = cookies,
            UseCookies = true,
            UseDefaultCredentials = false
        };
        // Add identity cookies:
        if (ctx != null && !ctx.UserExecuting.IsAnonymous) {
            string userName = String.Format("{0} ({1})", ctx.RequestingUser.UserName, ctx.UserExecuting.Key);
            cookies.Add(new Cookie(__userIdCookieName, userName));
            cookies.Add(new Cookie(__sidCookieName, sid));
            cookies.Add(new Cookie(__hashCookieName,
                                   GenerateHash(userName, Prefs.Instance.UrlPrefs.SharedSecret)));
        }
        var client = new HttpClient(handler) {
            BaseAddress = _prefServerBaseUrl
        };
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        return client;
    }
您可以将

带有转换器列表的JsonSerializerSettings传递给ReadAsAsync<T>将使用的JsonMediaTypeFormatter

var obj = await result.Content.ReadAsAsync<refsResponse>(
    new[] {new JsonMediaTypeFormatter {
          SerializerSettings = new JsonSerializerSettings { 
              Converters = new List<JsonConverter> {
                //list of your converters
               }
             } 
          }
    });

可能你想使用 HttpClient.GetStringAsync Method (String)

var response = client.GetStringAsync("api/sites/" + sid);
return JsonConvert.DeserializeObject<PrefsResponse>(response.Result, new  PrefClassJsonConverter());

或者你到底想让什么更优雅?

我能够使用以下方法将自定义 JsonConverter 添加到 HttpClient 的默认格式化程序中:

MediaTypeFormatterCollection formatters = new MediaTypeFormatterCollection(); 
formatters.JsonFormatter.SerializerSettings.Converters.Add(new MyCustomConverter());

var result = response.Content.ReadAsAsync<T>(formatters).Result;

这似乎允许您将自定义转换器添加到默认转换器。

最新更新