Dot-Net
.net HttpClient 與自定義 JsonConverter
我正在使用 .NET 的 HttpClient 向 WebAPI 發出請求,該 WebAPI 返回一些 JSON 數據,這些數據需要在客戶端進行一些自定義反序列化。為此,我製作了自己的
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您的轉換器列表傳遞給JsonMediaTypeFormatter將由以下人員使用的ReadAsAsync<T>:IE
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());或者你到底想要什麼更優雅?