使用Refit调用API并反序列化为动态

时间:2017-09-12 06:01:42

标签: json refit

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

我尝试将界面定义为

[Get("/foo")]
Task<dynamic> GetFoo();

但是通话超时。

我知道我可以反序列化为像这样的动态

var mockString = "{ title: { name: 'fred', book: 'job'} }";
dynamic d = JsonConvert.DeserializeObject(mockString);

但是我无法弄清楚要通过Refit来让它做同样的事情。

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

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

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

[Get("/foo")]
Task<string> GetFoo();

如下所述: https://github.com/paulcbetts/refit#retrieving-the-response

答案 1 :(得分:2)

改装使用JSON.NET,因此任何与之配合使用的反序列化都适用于改装,包括dynamic 。您描述的界面完全正确。

这是一个真实的例子:

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

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

如果您使用的是iOS和Refit 4+,您可能会看到此错误:https://github.com/paulcbetts/refit/issues/359

正如Steven Thewissen所说,您可以使用Task<string>作为返回类型(或Task<HttpResponseMessage>,甚至Task<HttpContent>)来接收原始回复并自行反序列化,但您不应该&# 39; t必须 - 改装的重点在于它应该为你节省麻烦。