在專案中與廠商測試的過程中,發現對方API回傳的json字串出現無法解析的狀況,此篇記錄發現過程與解決的紀錄,希望之後有踩到坑的同仁可以少跌一些坑。
此次主要業務是與廠商做API介接
API(Post)-Response是用Json格式
result: 成功與否(true/false)
all_count:總筆數
list []:票號約定回傳清單
tran_code:異動別(A=增加,D=刪除)
tkt_no:票號
tkt_tp:票種(01=成人,02=愛心,03=團體)
dep_id:單位代碼
date:約定日期/傳輸日期
status:狀態(00=異動成功,01=異動)
接收到回傳的json結果為以下值
{"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字串變成
?{"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表的檔案內容時,先對此字串做過濾後,再做解析處理
//過濾掉Bom標頭字元
responseBody= responseString.Trim(new char[] { '\uFEFF'});
//再將json string 解析成物件
var result = JsonConvert.DeserializeObject<DeserializeObj>(responseBody);
2.檔案面
如果是檔案的字串藏有Bom的標頭符號,可用NotePad++ 開啟文件後在上面的編碼選取轉換UTF-8後再另存新檔,之後程式如果要讀取檔案內容應該讀取新的存檔