ASP.NET Core MVC 기본 JSON 파서에서 Jil(출력)로 변경

4102 단어
전에 기록해 두었는데, ASP를.NET MVC5의 JSON 파서가 Jil로 바뀌어 표시됩니다.
본 논문은 출력할 때만 교체하고 새로운 내용은 다음과 같다.NET Core 2.0의 기본 JSON 파서가 Jil로 대체됩니다.
본문에서 다루는 내용은 ASP이다.NET Core MVC에서는 출력 JSON 파서를 Jil(Nuget, Github)로 대체합니다.
공식 입출력 Json 해석 구현 소스를 열거합니다.
  • TextInputFormatter(공식 소스, 텍스트 입력 클래스)
  • Text OutputFormatter(공식 원본, 텍스트 출력 클래스, 본문 기본 클래스)
  • MediaTypeHeaderValues(공식 콘텐츠-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만 계승하고 관련 방법을 실현하면 다 끝낼 수 없다.
    에 있습니다.NET Core에서 Http에서 요청한 Json 구문 분석은 입력 구문 분석 및 출력 구문 분석으로 구분됩니다.
  • 입력(요청 매개 변수): 일반적으로 매개 변수가 비교적 적다(범용 목록이라도 Count는 크지 않다). 그래서 공식적인 Json.NET가 해석할 때도 큰 성능 문제가 없었다.
  • 출력(응답 결과): 이 부분은 관련된 데이터 양이 비교적 많기 때문에 본고는 출력 대상의 Json 포맷만 실현했다.

  • 주요 단계
    1. 출력 Json 해상도 클래스 구축TextOutputFormatter 2, Startup에 새 출력 Json 해상도 등록하기 3, 모두 종료
    구체적 절차
    1. Visual Studio Code에서 항목을 열고 내장된 터미널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을 참고하여 자체 제작(이것을 사용하지 않고 코드에서 문자열을 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의 대체로 모두 끝났다.

    좋은 웹페이지 즐겨찾기