IT踩坑日常- bom頭標記導致json無法解析
前言
在專案中與廠商測試的過程中,發現對方API回傳的json字串出現無法解析的狀況,此篇記錄發現過程與解決的紀錄,希望之後有踩到坑的同仁可以少跌一些坑。
此次主要業務是與廠商做API介接
API(Post)-Response是用Json格式
1 | result: 成功與否(true/false) |
踩坑過程
接收到回傳的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格式,就會遇到這個問題。
解決方法
程式面
讀取Response json或帶有Bom表的檔案內容時,先對此字串做過濾後,再做解析處理1
2
3
4
5//過濾掉Bom標頭字元
responseBody= responseString.Trim(new char[] { '\uFEFF'});
//再將json string 解析成物件
var result = JsonConvert.DeserializeObject<DeserializeObj>(responseBody);檔案面
如果是檔案的字串藏有Bom的標頭符號,可用NotePad++ 開啟文件後在上面的編碼選取轉換UTF-8後再另存新檔,之後程式如果要讀取檔案內容應該讀取新的存檔