2024-04-18|閱讀時間 ‧ 約 24 分鐘

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

前言

在專案中與廠商測試的過程中,發現對方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後再另存新檔,之後程式如果要讀取檔案內容應該讀取新的存檔



參考資料

[C#] BOM 隱士


分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.