android解析json出錯:JSONException: Value of type java.lang.String cannot be converted to JSONObject。
很簡單的一個json字符串: {"statu":"1","results":"true"},明顯看著是沒什么格式錯誤的,然后用各種json格式校驗工具檢測也都沒什么問題,但程序里就一直報錯。
google之后發(fā)現(xiàn)是BOM報頭問題。服務(wù)器端是php,返回的接送數(shù)據(jù)'{'前有bom報頭,java讀的時候把報頭直接當(dāng)作文件內(nèi)容讀,然后就會出錯。
一般是服務(wù)器端代碼格式的問題
BOM報頭又叫UTF-8簽名,其實UTF-8 的BOM對UFT-8沒有作用,是為了支援UTF-16,UTF-32才加上的BOM,BOM簽名的意思就是告訴編輯器當(dāng)前文件采用何種編碼,方便編輯器識別,但是BOM雖然在編輯器中不顯示,但是會產(chǎn)生輸出,就像多了一個空行,一般的php代碼如果用記事本等軟件編輯保存過之后,在保存一個以UTF-8編碼的文件時,會在文件開始的地方插入三個不可見的字符(0xEF 0xBB 0xBF,即BOM)。它是一串隱藏的字符,用于讓記事本等編輯器識別這個文件是否以UTF-8編碼。(還不清楚為什么會在返回數(shù)據(jù)時候也自動加上了BOM報頭)。
java、android客戶端等可以通過代碼過濾掉bom,然后再解析。
/** * 去除bom報頭 */public static String formatString(String s) { if (s != null) { s = s.replaceAll("\ufeff", ""); } return s;}
這個bom問題真是困擾了很久。。。
服務(wù)器端過濾掉bom可以參考這篇文章:
PHP去除BOM頭