JSON如今是非经常见的处理数据的方式了。但因为自己使用的是反射获取数据,必须自己处理特殊字符,但总是发现有一些看不见的字符在前台

var obj = jQuery.parseJSON(msg);会转换失败。

    比如例如以下在Vs中能够看到仅仅有两个字符

  JSON数据的处理中的特殊字符_jquery

可实际上却有三个字符,使用notepad++打开

JSON数据的处理中的特殊字符_jquery_02

一直不明确这些字符是怎样进入数据库的,但进入了,就必须处理,否则在前台就会转换失败。导致数据载入失败。

非常长时间以为是因为用户复制了一些其它编码的文字,在中文中没有相应的编码。导致的错误。这次又出现了。于是又细致研究了一下。发现原来是ASCⅡ表中的控制字符。!

  明确了这个处理自然就非常easy了。

后台反射转化为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();
}


 ​