zoukankan      html  css  js  c++  java
  • JSON数据的处理中的特殊字符

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

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

        例如如下在Vs中可以看到只有两个字符

      

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

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

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

      明白了这个处理自然就很简单了。

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

    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 '':
    53.  
      sb.Append("\b"); break;
    54.  
      case 'f':
    55.  
      sb.Append("\f"); break;
    56.  
      case ' ':
    57.  
      sb.Append("\n"); break;
    58.  
      case ' ':
    59.  
      sb.Append("\r"); break;
    60.  
      case ' ':
    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/38368731

  • 相关阅读:
    移动端布局方案汇总&&原理解析
    Javascript运行机制
    git 使用
    async await详解
    vue使用axios调用豆瓣API跨域问题
    hash和history的区别
    http状态码
    XSS 和 CSRF简述及预防措施
    【pytorch】pytorch基础学习
    [源码解读] ResNet源码解读(pytorch)
  • 原文地址:https://www.cnblogs.com/mq0036/p/9411467.html
Copyright © 2011-2022 走看看