.NET Core 3.1 API 的 JSON 編碼設定

昨天遇到一個奇怪的問題,特此紀錄一下

開個乾淨的專案來重現一下問題

版本:.NET Core 3.1 

開發工具 :Visual Studio 2019

呼叫 API:Chrome ( 沒有安裝 json viewer )


在內建的程式碼中新增一個方法,回傳含有中文的 JSON 格式資料


結果使用 Chrome 呼叫該 API,預期應該看到 ["蘋果","香蕉"]

卻發現看到的回應訊息是 Unicode 的編碼 ["\u860B\u679C","\u9999\u8549"]

乍看還會以為是什麼亂碼XD

( 這邊要留意一下,如果 Chrome 有安裝相關的 json viewer 可能會自動轉中文,建議先將套件關掉比較好觀察 )

發現非英文的字元都會被編碼,但這樣中文字的可閱讀性很低(幾乎是沒有),

於是上網查了資料,發現需要調整 StartUp.cs 裡面的 ConfigureServices 方法

將原本的 services.AddControllers() 後面在加上 AddJsonOptions 的相關設定

讓所有的字元都保持原來的樣子,不要使用 unicode 編碼

services.AddControllers().AddJsonOptions(options =>
{
     options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All);
});



重新呼叫 API 查看回應訊息,就可以成功看到中文字了



但如果我想輸出單引號 ["一顆'蘋果'","一根'香蕉'"] 的話

那麼 API 的回應是什麼呢?




Chrome 會看到 ["一顆\u0027蘋果\u0027","一根\u0027香蕉\u0027"]


登冷~~~  證明事情不是憨人所想的這麼簡單 XDDDDDD

接著又測試印出其他符號,發現不只 ' 單引號會變成\u0027,

像是 + 加號變成\u0026,或是 & 符號變成\u002B,貌似有些符號還是會被編碼

於是又一陣的 google 之後,終於在一篇回應找到答案!


調整一下 JSON 的編碼設定,改用 JavaScriptEncoder.UnsafeRelaxedJsonEscaping


呼叫 API ,終於看到完整資料啦!


補充資料:

留言

這個網誌中的熱門文章

CPE 一顆星選集題目說明與解答 - Java 筆記與心得分享

Visual Studio 自動排版格式化程式碼

1. Vito's family (CPE10406, UVA10041) - CPE一顆星解答與說明