IT踩坑日常- bom頭標記導致json無法解析

前言

在專案中與廠商測試的過程中,發現對方API回傳的json字串出現無法解析的狀況,此篇記錄發現過程與解決的紀錄,希望之後有踩到坑的同仁可以少跌一些坑。

此次主要業務是與廠商做API介接
API(Post)-Response是用Json格式

1
2
3
4
5
6
7
8
9
result: 成功與否(true/false)
all_count:總筆數
list []:票號約定回傳清單
tran_code:異動別(A=增加,D=刪除)
tkt_no:票號
tkt_tp:票種(01=成人,02=愛心,03=團體)
dep_id:單位代碼
date:約定日期/傳輸日期
status:狀態(00=異動成功,01=異動失敗)

踩坑過程

接收到回傳的json結果為以下值

1
{"result":"true", "all_count":1, "list":[{"tran_code":"A", "tkt_no":"AKY0727","tkt_tp":"01","dep_id":"00R","date":"20240401","status":"00"}]}

程式在解析時丟出了無法解析的錯誤,乍看之下此字串是正常格式的json字串,但將此字串貼在記事本儲存時,會提醒你內文中含有urldecode的字元,儲存後的內容發生變化之類的提醒,再開啟文件之後發現原本的json字串變成

1
?{"result":"true", "all_count":1, "list":[{"tran_code":"A", "tkt_no":"AKY0727","tkt_tp":"01","dep_id":"00R","date":"20240401","status":"00"}]}

但實際上此字元也並非字面上看到的是藏著?的字元而是Bom表標頭的標記符號(不佔空間的空白,unicode編碼中表示:\uFEFF)導致,當json Response字串中藏著Bom標記符號時,預設使用UTF-8讀取json格式,就會遇到這個問題。

解決方法

  1. 程式面
    讀取Response json或帶有Bom表的檔案內容時,先對此字串做過濾後,再做解析處理

    1
    2
    3
    4
    5
    //過濾掉Bom標頭字元​
    responseBody= responseString.Trim(new char[] { '\uFEFF'});

    //再將json string 解析成物件​
    var result = JsonConvert.DeserializeObject<DeserializeObj>(responseBody);
  2. 檔案面
    如果是檔案的字串藏有Bom的標頭符號,可用NotePad++ 開啟文件後在上面的編碼選取轉換UTF-8後再另存新檔,之後程式如果要讀取檔案內容應該讀取新的存檔
    IT_Exp_JsonWithBomTrap_1

參考資料

[C#] BOM 隱士