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

时间:2014-11-10 01:29:51

标签: c# json asp.net-web-api dropbox-api

我正在尝试使用ASP.NET Web API客户端库(HttpClient类等)和ReadAsAsync<>()方法在C#中创建Dropbox的JSON API消费者。

对于大多数方法来说,这样的事情足以满足我的需求:

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

但是,API有a method to get the metadata, for either a file or a folder(相同的操作)。我会喜欢为文件/文件夹设置不同的类,但我不一定知道在调用API获取元数据时我会回来的。

如果我直接使用JSON.NET,我相信我可以指定一个自定义的ContractResolver来根据内容确定它应该反序列化的类(其中一个数据字段是一个真/假标志,它会告诉我哪个适用)。但是,我没有通过HttpClient公开的方式看到任何方法。

因此。在我进行hacky回退之前(反序列化为基类,根据标志重新反序列化为适当的子进程),有没有办法以编程方式让HttpClient找出JSON应该反序列化到哪个类?

1 个答案:

答案 0 :(得分:1)

我尝试使用ReadAsStringAsync简单地将结果作为字符串获取,然后使用您建议的自定义IContractResolver自行将其提供给JSON.NET。这并不像你建议的那样预先设置它,但它比反序列化/重新序列化要好。

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

顺便说一句,您可能不应该在Result方法上使用Wait()await等阻止内容,因为它可能会在误用时导致死锁(请参阅文章{{3 }和Best Practices in Asynchronous Programming)。在Web上下文中,这通常意味着您的控制器应将其操作编写为async方法。在这里写它的方式是:

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