2017-07-19 39 views
1

我有一個WebAPI端點來接受一個通用對象。從POST主體反序列化一個通用對象

[HttpPost] 
[ApiRoute("endpoint/{type}")] 
public IHttpActionResult MyPostEndpoint(TypeEnum type, [FromBody] object myObject){} 

我們的對象上工作一般,但然後最終將其轉化爲我們的對象類型,但是當我們這樣做,我們必須首先把它變成一個JObject,所以抓住物體看起來是這樣的:

var myfoo = ((JObject) object).ToObject<Foo>(); 

如果我直接提供Foo作爲POST參數(例如[FromBody] Foo myObject),那麼它會將傳入的JSON反序列化爲Foo,但它不會反序列化爲通用C#對象。有沒有一種方法可以讓它反序列化爲一個通用的C#對象,而不是將它留在JObject中,這樣我就可以像這樣獲取myfoo了?

var myfoo = (Foo) object; 
+0

是否有一個理由,爲什麼你不希望參數指定爲'Foo'?爲什麼它需要成爲一個「對象」?你說它在指定爲'Foo'時有效。 –

+2

您在此上下文中使用「通用」不正確。無論如何,嘗試將'object'改爲'JObject'。您最好創建適當的類型並使用它。接受任何格式的API,API將會在早些時候找出試圖發送中斷的API。 – CodeCaster

+0

爲了使'(Foo)obj'投射正常,'obj'必須已經可以賦值給'Foo'類型。在這種情況下,它需要被反序列化爲一個'Foo'(或者'Foo'的後代)。在這一點上,它不能也是一個'JObject'(除非'JObject'從'Foo'下降!)是否有動機去控制反序列化?也許要抓到一個無效的演員? – Oly

回答

1

作爲返回數據的通用Post方法,我使用了。比你可以通過任何一類,所以要求更gerneric

public class Requests 
{ 
//... 
public async Task<ResultType> Create<ResultType>(string uri) 
{ 
//TODO implementation of httpclient POST logic go here 

var data = await results.Content.ReadAsStringAsync(); 
var result = JsonConvert.DeserializeObject<ResultType>(data); 
return result; 
} 

調用方法

List<foo> foos = new List<foo>(); 
Request requestToServer = new request(); 
Task.WaitAll(Task.Run(async =>(){ 
foos = await requestToServer.Create<Foo>("/foo"); 
})); 

現在,你可以通過任何預定義類