为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

白猪掌柜的 2019-12-16 10:35:34
我正在调用WebAPI的方法,该方法发送一个我想与模型匹配(或绑定)的json。在控制器中,我有一个类似的方法:public Result Post([ModelBinder(typeof(CustomModelBinder))]MyClass model);“ MyClass”,作为一个抽象类的参数给出。我想根据所传递的json的类型,实例化正确的继承类。为了实现它,我正在尝试实现一个自定义的活页夹。问题是(我不知道它是否很基本,但是什么也找不到)我不知道如何检索请求中包含的原始Json(或更好的某种序列化)。我懂了:actionContext.Request.Content但是所有方法都公开为异步方法。我不知道这适合将生成模型传递给控制器方法的人...将Json反序列化为Asp.Net Web API中的派生类型
查看完整描述

4 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

您可以正常调用异步方法,您的执行将被暂停,直到该方法返回为止,并且您可以以标准方式返回模型。像这样打电话:


string jsonContent = await actionContext.Request.Content.ReadAsStringAsync();

它将为您提供原始JSON。


查看完整回答
反对 回复 2019-12-16
?
慕少森

TA贡献2019条经验 获得超9个赞

如果您想使用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__Start


var 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,向我展示了该字段属性的自定义反序列化器。


查看完整回答
反对 回复 2019-12-16
  • 4 回答
  • 0 关注
  • 564 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信