Json 使用Refit和反序列化调用API以动态

Json 使用Refit和反序列化调用API以动态,json,refit,Json,Refit,我正在使用Refit调用REST服务,我想反序列化作为动态类型返回的JSON 我尝试将接口定义为 [Get("/foo")] Task<dynamic> GetFoo(); 但我想不出要通过什么改装才能让它也这么做 另一个选择是让Refit将原始JSON传回,这样我就可以自己反序列化它,但我也看不到实现这一点的方法 有什么想法吗?您可以定义接口以返回字符串并通过这种方式获取原始JSON: [Get("/foo")] Task<string> GetFoo(); [Ge

我正在使用Refit调用REST服务,我想反序列化作为动态类型返回的JSON

我尝试将接口定义为

[Get("/foo")]
Task<dynamic> GetFoo();
但我想不出要通过什么改装才能让它也这么做

另一个选择是让Refit将原始JSON传回,这样我就可以自己反序列化它,但我也看不到实现这一点的方法


有什么想法吗?

您可以定义接口以返回字符串并通过这种方式获取原始JSON:

[Get("/foo")]
Task<string> GetFoo();
[Get(“/foo”)]
任务GetFoo();
如下所述:
Refit在引擎盖下使用JSON.NET,因此任何与之一起工作的反序列化都将与Refit一起工作,包括
动态
。您描述的界面完全正确

下面是一个实际的工作示例:

public interface IHttpBinApi
{
    [Get("/ip")]
    Task<dynamic> GetIp();
}

var value = await RestService.For<IHttpBinApi>("http://httpbin.org").GetIp();
公共接口IHttpBinApi
{
[获取(“/ip”)]
任务GetIp();
}
var value=wait RestService.For(“http://httpbin.orgGetIp();
如果您正在使用iOS并重新安装4+,您可能会看到以下错误:


正如Steven Thewissen所说,您可以使用
Task
作为返回类型(或
Task
,甚至
Task
)来接收原始响应并对自己进行反序列化,但您不必这样做——重新安装的全部目的是为了省去您的麻烦。

为什么需要这样做?强类型有什么不对?超时听起来很奇怪-您确定问题出在
动态
返回类型上吗?我能够在refit界面中指定它,并返回了一个
动态
(在引擎盖下,一个
JObject
-作为JSON.NET处理反序列化)返回良好。@Thomas我事先不知道JSON的形状,因此无法提供强类型。如果我返回一个动态,我可以在数据中导航。@rdavisau这似乎与我使用的端点有关。其他端点工作正常。您的示例工作正常。我正在使用这个端点,它在尝试返回动态时超时,但在返回字符串时有效。
public interface IHttpBinApi
{
    [Get("/ip")]
    Task<dynamic> GetIp();
}

var value = await RestService.For<IHttpBinApi>("http://httpbin.org").GetIp();