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

4xrmg8kj  于 2023-02-26  发布在  其他
关注(0)|答案(2)|浏览(175)

我正在使用Refit调用REST服务,并希望将作为动态类型返回的JSON反序列化。
我尝试将接口定义为

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

但呼叫超时。
我知道我可以反序列化为这样的动态

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

但我不知道该传递什么给Refit让它做同样的事情。
另一种选择是让Refit将原始JSON传递回来,这样我就可以自己反序列化它,但我也看不到这样做的方法。
有什么想法吗?

x33g5p2x

x33g5p2x1#

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

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

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

tktrz96b

tktrz96b2#

Refit在底层使用JSON .NET,所以任何使用它的反序列化都可以使用Refit,包括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>)来接收原始响应并反序列化自己,但您不应该必须这样做--Refit的全部意义在于它应该为您省去这个麻烦。
[更新日期:2023年2月]
Refit现在默认使用System.Text.Json(参见下面的注解),但是这里的方法应该仍然有效。

相关问题