將 ASP.NET Core MVC 默認(rèn)的 JSON 解析器換為 Jil(輸出)

之前記錄了一下,將 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)源碼:



環(huán)境:

整體說明:

由于 .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é)束了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末仔蝌,一起剝皮案震驚了整個(gè)濱河市泛领,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌敛惊,老刑警劉巖渊鞋,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異瞧挤,居然都是意外死亡锡宋,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門特恬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來执俩,“玉大人,你說我怎么就攤上這事癌刽∫凼祝” “怎么了尝丐?”我有些...
    開封第一講書人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)衡奥。 經(jīng)常有香客問我爹袁,道長(zhǎng),這世上最難降的妖魔是什么矮固? 我笑而不...
    開封第一講書人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任失息,我火速辦了婚禮,結(jié)果婚禮上乏屯,老公的妹妹穿的比我還像新娘根时。我一直安慰自己,他們只是感情好辰晕,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開白布蛤迎。 她就那樣靜靜地躺著,像睡著了一般含友。 火紅的嫁衣襯著肌膚如雪替裆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評(píng)論 1 290
  • 那天窘问,我揣著相機(jī)與錄音辆童,去河邊找鬼。 笑死惠赫,一個(gè)胖子當(dāng)著我的面吹牛把鉴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播儿咱,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼庭砍,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了混埠?” 一聲冷哼從身側(cè)響起怠缸,我...
    開封第一講書人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎钳宪,沒想到半個(gè)月后揭北,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吏颖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年搔体,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侦高。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嫉柴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出奉呛,到底是詐尸還是另有隱情计螺,我是刑警寧澤夯尽,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站登馒,受9級(jí)特大地震影響匙握,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜陈轿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一圈纺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧麦射,春花似錦蛾娶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至峻呛,卻和暖如春罗售,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钩述。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來泰國打工寨躁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人牙勘。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓职恳,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親方面。 傳聞我的和親對(duì)象是個(gè)殘疾皇子话肖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,841評(píng)論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件葡幸、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,066評(píng)論 4 62
  • 也許每個(gè)人的心里都住著一個(gè)人,他可能不是你的愛人贺氓,也不是你的親人蔚叨,可他卻是你時(shí)常會(huì)牽掛的人。你發(fā)現(xiàn)辙培,他已不...
    臨水伊人閱讀 206評(píng)論 0 0
  • 4月2日蔑水,不是愚人節(jié),我多希望是愚人節(jié)扬蕊,老天跟我開了個(gè)玩笑… 老爸感冒了半個(gè)月了搀别,一直沒好,今天讓老媽陪著去醫(yī)院檢...
    果貝兒閱讀 171評(píng)論 0 0
  • “青春是段跌跌撞撞的旅行尾抑,擁有著后知后覺的美麗歇父。忘不了我們一起踩著驚濤駭浪蒂培,去知識(shí)的海洋遠(yuǎn)航;忘不了我們一起攀著懸...
    哩啦創(chuàng)新君閱讀 302評(píng)論 0 1