从POST主体反序列化通用对象

时间:2017-07-19 13:41:15

标签: c# asp.net-web-api

我有一个WebAPI端点,用于接收通用对象。

Timer.scheduledTimer(timeInterval: 10, target: self, selector: #selector(getTweets), userInfo: nil, repeats: true). 

func getTweets() {

    let locationName = Helper.sharedInstance.userDefault.value(forKey: ModelKey.currentLocation) as? String

    let accessToken = Helper.sharedInstance.userDefault.value(forKey: ModelKey.twitterAccessToken) as? String

    if (locationName == "Bengaluru" && nil != accessToken) || (locationName == "Bangalore" && nil != accessToken){
        tweetModel.getTweets(accessToken: accessToken!, city: ModelKey.blrcitytraffic, cityName: "Bengaluru")
    }
}

我们一般地处理对象,但最终将它转换为我们的对象类型,但是当我们这样做时,我们必须先将它转换为JObject,所以抓取对象看起来像这样:

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

如果我直接提供Foo作为我的POST参数(例如var myfoo = ((JObject) object).ToObject<Foo>(); ),那么它会将传入的JSON反序列化为Foo,但它不会反序列化为通用C#对象。有没有办法让它反序列化为一个通用的C#对象,而不是让它成为一个JObject,所以我可以这样得到myfoo?

[FromBody] Foo myObject

2 个答案:

答案 0 :(得分:1)

作为返回数据的通用post方法,我使用。比你可以传递任何类,所以请求更通用

 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");
}));

现在您可以传递任何预定义的类

答案 1 :(得分:0)

我认为您可以喜欢下面的方法来使用松散类型的方法

public static class HttpRequestHelper
    {
        public static async Task<T> GetDataModelFromRequestBodyAsync<T>(HttpRequestMessage req)
        {
            dynamic requestBody = await req.Content.ReadAsStringAsync();
            object blobModelObject = JsonConvert.DeserializeObject<object>(requestBody);
            var blobModel = ((JObject)blobModelObject).ToObject<T>();

            return blobModel;
        }
    }

,用法如下:

var blobModel = await HttpRequestHelper.GetDataModelFromRequestBodyAsync<RequestBlobModel>(req);

希望有帮助