.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 編碼
呼叫 API ,終於看到完整資料啦!
services.AddControllers().AddJsonOptions(options =>
{
options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All);
});
重新呼叫 API 查看回應訊息,就可以成功看到中文字了
但如果我想輸出單引號 ["一顆'蘋果'","一根'香蕉'"] 的話
那麼 API 的回應是什麼呢?
Chrome 會看到 ["一顆\u0027蘋果\u0027","一根\u0027香蕉\u0027"]
接著又測試印出其他符號,發現不只 ' 單引號會變成\u0027,
像是 + 加號變成\u0026,或是 & 符號變成\u002B,貌似有些符號還是會被編碼
於是又一陣的 google 之後,終於在一篇回應找到答案!
調整一下 JSON 的編碼設定,改用 JavaScriptEncoder.UnsafeRelaxedJsonEscaping
補充資料:
留言
張貼留言