之前記錄了一下,將 ASP.NET MVC5 中的 JSON 解析器替換為 Jil技肩,點(diǎn)此查看撇吞。
本文只針對(duì)輸出時(shí)進(jìn)行替換,新的內(nèi)容:將 .NET Core 2.0 的默認(rèn) JSON 解析器替換為 Jil堆巧。
本文涉及的內(nèi)容是在 ASP.NET Core MVC 中將輸出 JSON 解析器替換為 Jil(Nuget妄荔、Github)。
列舉一些官方的輸入/輸出的 Json 解析實(shí)現(xiàn)源碼:
- TextInputFormatter(官方源碼谍肤,文本輸入類)
- TextOutputFormatter(官方源碼啦租,文本輸出類,本文基類)
- MediaTypeHeaderValues(參考官方 Content-Type)
- JsonInputFormatter(官方源碼荒揣,參考)
- JsonOutputFormatter(官方源碼篷角,參考)
環(huán)境:
- MacBook Pro 13 Retina 8G/256G
- macOS Sierra 10.12.3
- Visual Studio Code 1.10.2
- .NET Core 1.1
整體說明:
由于 .NET Core 的全面拆包,所以系任,不能像上一篇記錄那樣恳蹲,只繼承一個(gè) MediaTypeFormatter
,實(shí)現(xiàn)相關(guān)的方法俩滥,就全部搞定了嘉蕾。
在 .NET Core 中,Http 請(qǐng)求的 Json 解析举农,分了 輸入解析 和 輸出解析荆针。
- 輸入(請(qǐng)求參數(shù)):一般來說,參數(shù)比較少(即使是泛型列表颁糟,Count 也不會(huì)很大)航背,所以,官方的 Json.NET 在解析時(shí)棱貌,也沒有太大的性能問題玖媚。
- 輸出(響應(yīng)結(jié)果):這個(gè)部分可能涉及的數(shù)據(jù)量比較大,所以婚脱,本文只是實(shí)現(xiàn)了輸出對(duì)象的 Json 格式化今魔。
主要步驟
1勺像、建立輸出 Json 解析類(繼承自 TextOutputFormatter
)
2、在 Startup
中注冊(cè)新的輸出 Json 解析器
3错森、全部結(jié)束
具體步驟
1吟宦、在 Visual Studio Code 中打開項(xiàng)目,通過其內(nèi)置終端的 dotnet
命令安裝 Jil涩维,如下所示:
dotnet add package jil
本文安裝的版本是:2.15.0殃姓。
1.1、用單例實(shí)現(xiàn)一個(gè) 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
睡蟋,自建一個(gè)(也可以不用這個(gè)踏幻,直接在代碼中,將字符串轉(zhuǎn)換成 MediaTypeHeaderValue
即可戳杀,這里單獨(dú)建立的目的主要是考慮到以后的復(fù)用)
// 命名空間
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该面、在項(xiàng)目中,新建一個(gè) JilOutFormatter
的類信卡,繼承自 TextOutputFormatter
吆倦,如下所示:
// 命名空間
using Microsoft.AspNetCore.Mvc.Formatters;
using System;
using System.Text;
using System.Threading.Tasks;
public class JilOutFormatter : TextOutputFormatter
{
// 構(gòu)造函數(shù)
public JilOutFormatter()
{
SupportedEncodings.Add(Encoding.UTF8);
SupportedEncodings.Add(Encoding.Unicode);
SupportedMediaTypes.Add(ContentTypeValues.AppJson);
SupportedMediaTypes.Add(ContentTypeValues.TxtJson);
}
// 實(shí)現(xiàn)父類的核心方法
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)
這個(gè)方法,按照如下修改:
public void ConfigureServices(IServiceCollection services)
{
// 一定要在 AddMvc 之前調(diào)用 AddMvcCore 方法來注冊(cè)自定義的 Json 解析器
services.AddMvcCore(opts => { opts.OutputFormatters.Add(new JilOutFormatter()); });
services.AddMvc();
}
4晌梨、至此桥嗤,輸出的 Json 解析用 Jil 的替換就全部結(jié)束了。