猿问

将Json反序列化为Asp.Net Web API中的派生类型

我正在调用WebAPI的方法,该方法发送一个我想与模型匹配(或绑定)的json。


在控制器中,我有一个类似的方法:


public Result Post([ModelBinder(typeof(CustomModelBinder))]MyClass model);

“ MyClass”,作为一个抽象类的参数给出。我想根据所传递的json的类型,实例化正确的继承类。


为了实现它,我正在尝试实现一个自定义的活页夹。问题是(我不知道它是否很基本,但是什么也找不到)我不知道如何检索请求中包含的原始Json(或更好的某种序列化)。


我懂了:


actionContext.Request.Content

但是所有方法都公开为异步方法。我不知道这适合将生成模型传递给控制器方法的人...


将Json反序列化为Asp.Net Web API中的派生类型

白猪掌柜的
浏览 565回答 4
4回答

墨色风雨

您可以正常调用异步方法,您的执行将被暂停,直到该方法返回为止,并且您可以以标准方式返回模型。像这样打电话:string jsonContent = await actionContext.Request.Content.ReadAsStringAsync();它将为您提供原始JSON。

慕少森

如果您想使用TypeNameHandling.Auto但又担心安全性,或者不喜欢api消费者需要幕后知识,则可以处理$ type反序列化自身。public class InheritanceSerializationBinder : DefaultSerializationBinder{    public override Type BindToType(string assemblyName, string typeName)    {        switch (typeName)        {            case "parent[]": return typeof(Class1[]);            case "parent": return typeof(Class1);            case "child[]": return typeof(Class2[]);            case "child": return typeof(Class2);            default: return base.BindToType(assemblyName, typeName);        }    }}然后将其连接到global.asax.Application__Startvar config = GlobalConfiguration.Configuration;        config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings { Binder = new InheritanceSerializationBinder() };最终,我在包含不同类型对象的属性上使用了包装类和[JsonProperty(TypeNameHandling = TypeNameHandling.Auto)],因为我无法通过配置实际的类来使其正常工作。这种方法允许消费者在他们的请求中包括所需的信息,同时允许将允许值的文档独立于平台,易于更改和易于理解。所有这些都无需编写自己的converster。感谢:https : //mallibone.com/post/serialize-object-inheritance-with-json.net,向我展示了该字段属性的自定义反序列化器。
随时随地看视频慕课网APP
我要回答