JSON現在是很常見的處理數據的方式了。但由於自己使用的是反射獲取數據,必須自己處理特殊字符,但總是發現有一些看不見的字符在前台
var obj = jQuery.parseJSON(msg);會轉換失敗。
例如如下在Vs中可以看到只有兩個字符
可實際上卻有三個字符,使用notepad++打開
一直不明白這些字符是如何進入數據庫的,但進入了,就必須處理,否則在前台就會轉換失敗,導致數據加載失敗。
很長時間以為是由於用戶復制了一些其他編碼的文字,在中文中沒有對應的編碼,導致的錯誤。這次又出現了,於是又仔細研究了一下,發現原來是ASCⅡ表中的控制字符!!
明白了這個處理自然就很簡單了。
后台反射轉化為JSON的代碼:
-
private static string getValue<T>(T t, string pname) where T : class
-
{
-
Type type = t.GetType();
-
PropertyInfo pinfo = type.GetProperty(pname);
-
if (pinfo != null)
-
{
-
object v = pinfo.GetValue(t, null);
-
return v != null ? v.ToString() : "";
-
}
-
else
-
{
-
throw new Exception( "不存在屬性" + pname);
-
}
-
-
}
-
protected static string ConvertFromModeTojson<T>(T t, string columnInfos) where T : class
-
{
-
string[] cols = columnInfos.Split( new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
-
System.Text.StringBuilder sb = new System.Text.StringBuilder( 300);
-
string result = "{";
-
foreach ( string col in cols)
-
{
-
string name = "\"{0}\":\"{1}\",";
-
string value = getValue<T>(t, col);
-
value = String2Json( value);
-
sb.Append( string.Format(name, col, value));
-
-
}
-
result += sb.ToString().TrimEnd( ',');
-
result += "}";
-
return result;
-
}
-
/// <summary>
-
/// 過濾特殊字符
-
/// </summary>
-
/// <param name="s"></param>
-
/// <returns></returns>
-
private static string String2Json(String s)
-
{
-
StringBuilder sb = new StringBuilder();
-
for ( int i = 0; i < s.Length; i++)
-
{
-
char c = s.ToCharArray()[i];
-
switch (c)
-
{
-
case '\"':
-
sb.Append( "\\\""); break;
-
case '\\':
-
sb.Append( "\\\\"); break;
-
case '/':
-
sb.Append( "\\/"); break;
-
case '\b':
-
sb.Append( "\\b"); break;
-
case '\f':
-
sb.Append( "\\f"); break;
-
case '\n':
-
sb.Append( "\\n"); break;
-
case '\r':
-
sb.Append( "\\r"); break;
-
case '\t':
-
sb.Append( "\\t"); break;
-
default:
-
if ((c >= 0 && c <= 31)||c == 127) //在ASCⅡ碼中,第0~31號及第127號(共33個)是控制字符或通訊專用字符
-
{
-
-
}
-
else
-
{
-
sb.Append(c);
-
}
-
break;
-
}
-
}
-
return sb.ToString();
-
}
控制字符
出處:https://blog.csdn.net/xuexiaodong009/article/details/38368731