我正在使用 Refit 调用 REST 服务,并且想要反序列化作为动态类型返回的 JSON。
我尝试将接口定义为
[Get("/foo")]
Task<dynamic> GetFoo();
Run Code Online (Sandbox Code Playgroud)
但呼叫超时。
我知道我可以反序列化为这样的动态
var mockString = "{ title: { name: 'fred', book: 'job'} }";
dynamic d = JsonConvert.DeserializeObject(mockString);
Run Code Online (Sandbox Code Playgroud)
但我不知道要传递什么给 Refit 才能让它做同样的事情。
另一种选择是让 Refit 将原始 JSON 传回,这样我就可以自己反序列化它,但我也找不到办法做到这一点。
有任何想法吗?
Refit 在底层使用 JSON.NET,因此任何适用于它的反序列化都适用于 Refit,包括dynamic. 你所描述的界面是完全正确的。
这是一个真实的工作示例:
public interface IHttpBinApi
{
[Get("/ip")]
Task<dynamic> GetIp();
}
var value = await RestService.For<IHttpBinApi>("http://httpbin.org").GetIp();
Run Code Online (Sandbox Code Playgroud)
如果您使用 iOS 和 Refit 4+,您可能会看到此错误: https: //github.com/paulcbetts/refit/issues/359
正如 Steven Thewissen 所说,您可以使用Task<string>作为返回类型(或Task<HttpResponseMessage>,甚至Task<HttpContent>)来接收原始响应并反序列化自己,但您不必这样做 - Refit 的全部意义在于它应该为您节省麻烦。
[更新:02/2023]
Refit 现在System.Text.Json默认使用(请参阅下面的评论),但这里的方法应该仍然有效。
| 归档时间: |
|
| 查看次数: |
4690 次 |
| 最近记录: |