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

问题描述 投票:0回答:3

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

[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;
c# asp.net-web-api
3个回答
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");
}));

现在您可以通过任何预定义的课程


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

希望这有帮助


0
投票

.NET CLI

dotnet new web --name "GenericEndpointExample"
cd GenericEndpointExample
dotnet add package SingleApi

程序.cs:

var builder = WebApplication.CreateBuilder(args);

var app = builder.Build();

// map generic endpoint
app.MapSingleApi("sapi", 
    // add your generic request handler
    // for example, return the received data (already typed object)
    x => Task.FromResult(x.Data), 
    // add assemblies for resolving received data types
    typeof(MyClassName).Assembly, typeof(List<>).Assembly, typeof(int).Assembly);

app.Run();

类型请求示例:MyClassName

POST /sapi/MyClassName
{"Name":"Example"}

通用请求示例:字典

POST /sapi/Dictionary(String-Array(Nullable(Int32)))
{"key1":[555,null,777]}

带有示例的 GitHub 存储库

© www.soinside.com 2019 - 2024. All rights reserved.