我正在使用Refit调用REST服务,我想反序列化作为动态类型返回的JSON。
我尝试将界面定义为
[Get("/foo")]
Task<dynamic> GetFoo();
但是通话超时。
我知道我可以反序列化为像这样的动态
var mockString = "{ title: { name: 'fred', book: 'job'} }";
dynamic d = JsonConvert.DeserializeObject(mockString);
但是我无法弄清楚要通过Refit来让它做同样的事情。
另一个选择是让Refit将原始JSON传回去,这样我就可以自己反序列化了,但我也看不到这样做的方法。
有什么想法吗?
答案 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必须 - 改装的重点在于它应该为你节省麻烦。