使用ASP.NET Web API客户端库反序列化为多种可能的类型

本文关键字:类型 反序列化 NET ASP Web API 客户端 使用 | 更新日期: 2023-09-27 18:29:44

我正在尝试使用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应该反序列化到哪个类?

使用ASP.NET Web API客户端库反序列化为多种可能的类型

我会尝试简单地使用ReadAsStringAsync将结果作为字符串,然后按照您的建议使用自定义IContractResolver将其输入到JSON.NET中。这并不像您建议的那样提前设置它那么优雅,但它比反序列化/保留要好。

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

顺便说一句,您可能不应该在await able方法上使用像ResultWait()这样的阻塞,因为如果误用,它可能会导致死锁(请参阅文章《异步编程中的最佳实践》和《避免Async/Await中的死锁》)。在web上下文中,这通常意味着您的控制器应该将其操作写成async方法。在这里写它的方式是:

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