環境:
iOS客戶端,VS2010下編寫的服務端,數據庫SQL2005
json庫:http://stig.github.com/json-framework
json解析時,遇到一些控制碼將會出錯,造成數據解析失敗。之前測試過了客戶端提交的數據和服務端獲得的數據(存入數據庫前)一致,因此編碼轉換並沒有出錯,因此編碼不一致的問題排除。
網上查到過濾的僅是\b, \t, \n, \f, \r, \\, \'', /, 普遍的做法為:
View Code
1 static StringBuffer string2Json(String s) { 2 StringBuffer sb = new StringBuffer (); 3 for (int i=0; i<s.length(); i++) { 4 5 char c = s.charAt(i); 6 switch (c) { 7 case '\"': 8 sb.append("\\\""); 9 break; 10 case '\\': 11 sb.append("\\\\"); 12 break; 13 case '/': 14 sb.append("\\/"); 15 break; 16 case '\b': 17 sb.append("\\b"); 18 break; 19 case '\f': 20 sb.append("\\f"); 21 break; 22 case '\n': 23 sb.append("\\n"); 24 break; 25 case '\r': 26 sb.append("\\r"); 27 break; 28 case '\t': 29 sb.append("\\t"); 30 break; 31 default: 32 sb.append(c); 33 } 34 return sb.toString(); 35 }
對於上述控制符,該庫中已經做了過濾。
最終,在實際的數據傳遞(以UTF-8編碼傳遞,因為ios中默認為UTF-8)中,會發現一些內容里存在另外一些控制符。
例如:
utf-8下,hex為0x14,source code為“\u0014”的字符,這個字符的name為DEVICE CONTROL FOUR。關於這個字符的詳細介紹請點這里,另一些控制符列表可看這里。
我們用的這個第三方庫並不能過濾如上所說的控制符。
解決:
在服務端替換了一個json庫(json.net),新的json庫將內容中的控制符都過濾掉了,貌似在JsonTextReader里有相應的過濾源碼,不過還沒深入看,並不確定,有空在仁兄可以抽出來剖析剖析。
