2017-09-12 44 views
3

我使用Refit調用REST服務,並且我想反序列化作爲動態類型返回的JSON。使用Refit調用API並反序列化爲動態

我試圖定義界面

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

但呼叫超時。

我知道我可以反序列化到一個動態的這樣

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

,但我無法弄清楚如何通過改裝得到它這樣做。

另一種選擇是讓Refit將原始JSON傳回,以便我可以自己反序列化它,但是我看不到這樣做的方法。

任何想法?

+0

你爲什麼需要?強類型有什麼不對? – Thomas

+1

超時聽起來很奇怪 - 你確定問題出在'dynamic'返回類型嗎?我可以在修改界面中指定它,並返回一個'dynamic'(在引擎蓋下,一個'JObject'--因爲JSON.NET處理反序列化)。 – rdavisau

+0

@Thomas我不知道JSON的形狀提前,所以不能提供強大的類型。如果我返回動態,我可以瀏覽數據。 –

回答

2

重新安裝使用JSON.NET引擎蓋下,所以任何反序列化可與Refit配合使用,包括dynamic。你所描述的界面完全正確。

這裏是一個真正的工作示例:

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

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

如果您正在使用iOS和改裝4+,你可能會看到這樣的錯誤:https://github.com/paulcbetts/refit/issues/359

正如史蒂芬Thewissen指出的那樣,你可以使用Task<string>作爲你的返回類型(或者Task<HttpResponseMessage>,或者甚至是Task<HttpContent>)接收原始響應並反序列化你自己,但是你不應該 - 修改的整點是它應該爲你節省那些麻煩。

+0

你的例子工作正常。我正在使用此端點http://mockbin.org/bin/ef5fc5d9-bd0a-4fca-9ce0-ce49ec12b4d6,並且在嘗試返回動態時超時,但在返回字符串時工作。 –

+1

現在所有的工作。不知道爲什麼它沒有之前。 –