亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將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 關注
  • 608 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號