簡體   English   中英

使用ASP.NET Web API客戶端庫反序列化為多種可能的類型

[英]Deserializing to multiple possible types with ASP.NET Web API Client Libraries

我正在嘗試使用ASP.NET Web API客戶端庫(HttpClient類等)和ReadAsAsync <>()方法在C#中創建Dropbox的JSON API的使用者。

對於大多數方法來說,這樣的東西足以滿足我的需求:

return this.HttpClient.GetAsync("info").Result.Content.ReadAsAsync<AccountInfo>().Result;

但是,API有一種獲取文件或文件夾的元數據的方法 (相同的操作)。 有不同的類文件/文件夾,但我不一定知道我將調用API時,為了獲得元數據回去了。

如果我直接使用JSON.NET,我相信我可以指定一個自定義ContractResolver,以根據內容確定應反序列化的類(數據字段之一是true / false標志,它將告訴我哪個適用) 。 但是,我看不到通過HttpClient公開的方法來做到這一點。

所以。 在進行強悍的后備(將其反序列化為基類,然后根據該標志重新反序列化為適當的子對象)之前,有沒有一種方法可以讓HttpClient編程確定JSON應該反序列化到哪個類?

我將嘗試使用ReadAsStringAsync簡單地將結果作為字符串ReadAsStringAsync ,然后使用您建議的自定義IContractResolver自己將其輸入JSON.NET。 這不像可以像您建議的那樣預先設置它那樣優雅,但是比反序列化/重新序列化更好。

string json =
     this.HttpClient.GetAsync("info").Result.Content.ReadAsStringAsync().Result;
return JsonConvert.DeserializeObject(json, ....);

順便說一句,您可能不應該在可await方法上使用諸如ResultWait()類的東西,因為當濫用它們時,它可能導致死鎖(請參閱文章異步編程最佳實踐避免Async / Await中的死鎖 )。 在網絡環境中,這通常意味着您的控制器應將其操作編寫為async方法。 在這里寫的方式是:

string json =
     await (await this.HttpClient.GetAsync("info")).Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject(json, ....);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM