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

相關文章
相關標籤/搜索