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

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

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

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

  

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

一直不明白这些字符是如何进入数据库的,但进入了,就必须处理,不然在前台就会转换失败,致使数据加载失败。编码

很长时间觉得是因为用户复制了一些其余编码的文字,在中文中没有对应的编码,致使的错误。此次又出现了,因而又仔细研究了一下,发现原来是ASCⅡ表中的控制字符!!spa

  明白了这个处理天然就很简单了。.net

后台反射转化为JSON的代码:code

 

  1.  
    private static string getValue<T>(T t, string pname) where T : class
  2.  
    {
  3.  
    Type type = t.GetType();
  4.  
    PropertyInfo pinfo = type.GetProperty(pname);
  5.  
    if (pinfo != null)
  6.  
    {
  7.  
    object v = pinfo.GetValue(t, null);
  8.  
    return v != null ? v.ToString() : "";
  9.  
    }
  10.  
    else
  11.  
    {
  12.  
    throw new Exception( "不存在属性" + pname);
  13.  
    }
  14.  
     
  15.  
    }
  16.  
    protected static string ConvertFromModeTojson<T>(T t, string columnInfos) where T : class
  17.  
    {
  18.  
    string[] cols = columnInfos.Split( new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
  19.  
    System.Text.StringBuilder sb = new System.Text.StringBuilder( 300);
  20.  
    string result = "{";
  21.  
    foreach ( string col in cols)
  22.  
    {
  23.  
    string name = "\"{0}\":\"{1}\",";
  24.  
    string value = getValue<T>(t, col);
  25.  
    value = String2Json( value);
  26.  
    sb.Append( string.Format(name, col, value));
  27.  
     
  28.  
    }
  29.  
    result += sb.ToString().TrimEnd( ',');
  30.  
    result += "}";
  31.  
    return result;
  32.  
    }
  33.  
    /// <summary>
  34.  
    /// 过滤特殊字符
  35.  
    /// </summary>
  36.  
    /// <param name="s"></param>
  37.  
    /// <returns></returns>
  38.  
    private static string String2Json(String s)
  39.  
    {
  40.  
    StringBuilder sb = new StringBuilder();
  41.  
    for ( int i = 0; i < s.Length; i++)
  42.  
    {
  43.  
    char c = s.ToCharArray()[i];
  44.  
    switch (c)
  45.  
    {
  46.  
    case '\"':
  47.  
    sb.Append( "\\\""); break;
  48.  
    case '\\':
  49.  
    sb.Append( "\\\\"); break;
  50.  
    case '/':
  51.  
    sb.Append( "\\/"); break;
  52.  
    case '\b':
  53.  
    sb.Append( "\\b"); break;
  54.  
    case '\f':
  55.  
    sb.Append( "\\f"); break;
  56.  
    case '\n':
  57.  
    sb.Append( "\\n"); break;
  58.  
    case '\r':
  59.  
    sb.Append( "\\r"); break;
  60.  
    case '\t':
  61.  
    sb.Append( "\\t"); break;
  62.  
    default:
  63.  
    if ((c >= 0 && c <= 31)||c == 127) //在ASCⅡ码中,第0~31号及第127号(共33个)是控制字符或通信专用字符
  64.  
    {
  65.  
     
  66.  
    }
  67.  
    else
  68.  
    {
  69.  
    sb.Append(c);
  70.  
    }
  71.  
    break;
  72.  
    }
  73.  
    }
  74.  
    return sb.ToString();
  75.  
    }

控制字符

 

 

出处:https://blog.csdn.net/xuexiaodong009/article/details/38368731orm

相关文章
相关标签/搜索