abp部分接口轉換為首字母大寫返回


在對接手機端app接口時,由於手機端需要返回的模型使用首字母大寫的形式,abp(asp.net core)接口默認返回的數據是駝峰命名法,就是首字母小寫,我們自己的pc網頁端又是使用的駝峰法,所以不能直接改mvc的配置,這樣pc端所有的接口都要改。有同學是用的給字段指定json序列化名稱:

  [JsonProperty("Id")] public Guid Id { get; set; }

這樣寫不知道他累不累


解決

過程很曲折,不提也罷,直接說方案:
我們想要的效果是指定的接口(類型)使用指定的方式返回json格式。微軟爸爸給我們提供了IOutputFormatter接口用來格式化返回結果,我們就用這個接口來實現

創建自定義的格式化器

    public class JsonFormatter : JsonOutputFormatter
    {
        public const string FormatterName = "PacalJson";

        public JsonFormatter(JsonSerializerSettings serializerSettings, ArrayPool<char> charPool) : base(serializerSettings, charPool)
        {
            serializerSettings.ContractResolver = new DefaultContractResolver();
        }
        protected override bool CanWriteType(Type type)
        {
            //我的接口有兩種返回包裝類型XXX和XXX2,所以我直接根據返回類型判斷了,拿到了類型,還可以通過特性判斷,根據需要自己調整,如果你調試發現type是Abp.Web.Models.AjaxResponse類型,這是因為abp提前進行序列化了,在controller上添加特性[Abp.Web.Models.DontWrapResult],不使用abp默認的序列化
            if (type != null && type.IsGenericType
                && (typeof(XXX<>).IsAssignableFrom(type.GetGenericTypeDefinition())
                   || typeof(XXX2<>).IsAssignableFrom(type.GetGenericTypeDefinition())))
            {
                return true;
            }
            return false;
        }
    }

修改Startup文件的ConfigureServices方法中的AddMvc代碼

services.AddMvc(
                options =>
                {
                    options.Filters.Add(new CorsAuthorizationFilterFactory(_defaultCorsPolicyName));
                    var JsonSerializerSettings = new Newtonsoft.Json.JsonSerializerSettings
                    {
                        ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore,
                        ContractResolver = new DefaultContractResolver()
                    };
                    var jsonOutputFormatter = new JsonFormatter(JsonSerializerSettings, ArrayPool<char>.Shared);
                    options.OutputFormatters.Insert(0, jsonOutputFormatter);
                }
            );

在controller上添加特性,不使用abp默認的序列化

 [Abp.Web.Models.DontWrapResult]
public class XXXController
{

}

參考資料


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM