ASP.NET Core MVCデフォルトのJSON解析器をJil(出力)に変更

4072 ワード

前に記録しておきましたが、ASP.NET MVC 5のJSON解析器をJilに置き換えます.
本稿では、出力時のみを置き換える、新しい内容:を.NET Core 2.0のデフォルトJSON解析器をJilに置き換えます.
本文の内容はASP.NET Core MVCで出力JSON解析器をJil(Nuget,Github)に置き換えます.
いくつかの公式の入出力のJson解析実装ソースコードを列挙する.
  • TextInputFormatter(公式ソース、テキスト入力クラス)
  • TextOutputFormatter(公式ソース、テキスト出力クラス、本明細書ベースクラス)
  • MediaTypeHeaderValues(公式Content-Type参照)
  • JsonInputFormatter(公式ソース、参照)
  • JsonOutputFormatter(公式ソース、参照)
  • 環境:

  • MacBook Pro 13 Retina 8G/256G
  • macOS Sierra 10.12.3
  • Visual Studio Code 1.10.2
  • .NET Core 1.1

  • 全体の説明:


    によってNET Coreの全面解体なので、前回の記録のように、MediaTypeFormatterを1つだけ引き継いで、関連する方法を実現することができず、すべて完了しました.
    はい.NET Coreでは,Http要求のJson解析を入力解析と出力解析に分けた.
  • 入力(要求パラメータ):一般的にはパラメータが少ない(汎用リストでもCountは大きくない)ので、公式のJson.NETは解析時にも,あまり性能の問題はない.
  • 出力(応答結果):この部分に関連する可能性のあるデータ量は比較的大きいので,本稿では出力オブジェクトのJsonフォーマットを実現しただけである.

  • 主な手順


    1、出力Json解析クラスの確立(TextOutputFormatterより継承)2、Startupに新たな出力Json解析器3を登録し、全て終了

    具体的な手順


    1、Visual Studioコードでプロジェクトを開き、その内蔵端末のdotnetコマンドでJilをインストールする.以下に示す.
    dotnet add package jil
    

    この文書にインストールされているバージョンは2.15.0です.
    1.1、単例でJilHelperのクラスを実現し、主にあちこちでシーケンス化と逆シーケンス化の方法を使用するのが便利で、コードは以下の通りである.
    //     
    using Jil;
    
    using System.IO;
    
    public class JilHelper
    {
        private Options _options;
    
        private JilHelper()
        {
            _options = new Options(excludeNulls: true, includeInherited: true,
                dateFormat: DateTimeFormat.MillisecondsSinceUnixEpoch,
                serializationNameFormat: SerializationNameFormat.CamelCase);
        }
    
        public static readonly JilHelper Instance = new JilHelper();
    
        public void Serialize(TextWriter writer, object data)
        {
            JSON.Serialize(data, writer, _options);
        }
    }
    

    1.2、公式のMediaTypeHeaderValuesを参考にして、自分で1つを構築する(これを使わなくてもいい、直接コードの中で、文字列をMediaTypeHeaderValueに変換すればいい.ここで単独で確立する目的は主に後の多重化を考慮する)
    //     
    using Microsoft.Net.Http.Headers;
    
    internal class ContentTypeValues
    {
        public static readonly MediaTypeHeaderValue AppJson = MediaTypeHeaderValue.Parse("application/json").CopyAsReadOnly();
    
        public static readonly MediaTypeHeaderValue TxtJson = MediaTypeHeaderValue.Parse("text/json").CopyAsReadOnly();
    }
    

    2、プロジェクトにおいて、JilOutFormatterのクラスを新設し、TextOutputFormatterから継承し、以下に示す.
    //     
    using Microsoft.AspNetCore.Mvc.Formatters;
    
    using System;
    using System.Text;
    using System.Threading.Tasks;
    
    public class JilOutFormatter : TextOutputFormatter
    {
        //     
        public JilOutFormatter()
        {
            SupportedEncodings.Add(Encoding.UTF8);
            SupportedEncodings.Add(Encoding.Unicode);
    
            SupportedMediaTypes.Add(ContentTypeValues.AppJson);
            SupportedMediaTypes.Add(ContentTypeValues.TxtJson);
        }
    
        //          
        public override async Task WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding encoding)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }
    
            if (encoding == null)
            {
                encoding = Encoding.UTF8;
            }
    
            var response = context.HttpContext.Response;
    
            using (var writer = context.WriterFactory(response.Body, encoding))
            {
                JilHelper.Instance.Serialize(writer, context.Object);
                await writer.FlushAsync();
            }
        }
    }
    

    3、Startupにおいて、ConfigureServices(IServiceCollection services)という方法を見つけ、以下のように修正する.
    public void ConfigureServices(IServiceCollection services)
    {
        //      AddMvc      AddMvcCore           Json    
        services.AddMvcCore(opts => { opts.OutputFormatters.Add(new JilOutFormatter()); });
    
        services.AddMvc();
    }
    

    4、これで出力されたJson解析用Jilの置き換えはすべて終了する.