【问题标题】:Deserializing to multiple possible types with ASP.NET Web API Client Libraries使用 ASP.NET Web API 客户端库反序列化为多种可能的类型
【发布时间】:2014-11-10 01:29:51
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    我会尝试使用ReadAsStringAsync 简单地将结果作为字符串获取,然后按照您的建议使用自定义IContractResolver 自己将其输入JSON.NET。这不像您建议的那样能够预先设置它那么优雅,但它比反序列化/重新序列化更好。

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

    顺便说一句,您可能不应该在 awaitable 方法上使用像 ResultWait() 这样的阻塞方法,因为误用时会导致死锁(请参阅文章 Best Practices in Asynchronous ProgrammingAvoiding Deadlock in Async/Await)。在 Web 上下文中,这通常意味着您的控制器应该将其操作编写为 async 方法。这里的写法是:

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

    【讨论】:

    • 感谢异步参考。我做错了并不奇怪。这绝对是我知道我需要花更多时间学习的东西!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    相关资源
    最近更新 更多