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 '\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/38368731

JSON数据的处理中的特殊字符的更多相关文章

  1. TypeToken 是google提供的一个解析Json数据的类库中一个类

    Type listType = new TypeToken<LinkedList<User>>(){}.getType(); Type是java里的reflect包的Type ...

  2. 远程请求json数据,list中显示

    public class MainActivity extends Activity { protected static final int WHAT_REQUEST_SUCCESS = 1; pr ...

  3. [转]解析多级json数据为list中嵌套一级字典的形式

    #!/usr/bin/env python # encoding: utf-8 import json def read(obj,key): collect = list() for k in obj ...

  4. json 数据在textarea中显示的时候,切换 beauty和ugly模式

    转化为beauty模式 var jsonText = $('#json').val(); $('#json').val(JSON.stringify(JSON.parse(jsonText), nul ...

  5. PHP:将json数据放进html标签中的详细讲解

    1.在controller中调用某方法,得到最终的json数据.根据框架开发形式,将Json数据传入视图中 2.在视图中,我们放置一个hidden形式的标签,并获取到json数据 3.这时候,我们查看 ...

  6. Android中使用Gson解析JSON数据

      Android中使用Gson解析JSON数据 在Android中可以使用Gson解析JSON数据 首先,从 code.google.com/p/google-gson/downloads/list ...

  7. JSON数据解析(GSON方式) (转)

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种理想的数据交换格式. 在上一篇博文<Andro ...

  8. Spring MVC3返回JSON数据中文乱码问题解决(转)

    Spring MVC3返回JSON数据中文乱码问题解决 查了下网上的一些资料,感觉比较复杂,这里,我这几使用两种很简单的办法解决了中文乱码问题. Spring版本:3.2.2.RELEASE Jack ...

  9. Go处理json数据

    json数据格式 参见json数据格式说明. 如果没操作过json数据,建议先看下上面的文章,有助于理解本文后面的内容. Go json包 Marshal():Go数据对象 -> json数据 ...

随机推荐

  1. Activity中通过标签获取当前Fragment

    初始化完成之后才有数据,否则获取不到 String tag = "android:switcher:"+viewPager.getId()+":"+viewPa ...

  2. Capjoint

    前期知识储备: 现如今的全球台站分布情况:在全球大陆的分布并不均衡.在美国加利福尼亚.日本.中国台湾等地区,台站分布密集,数字化程度高.然而在世界很多地区发生的地震,往往在300km范围内仅有2到3个 ...

  3. ubuntu 更改hostname, hosts后没有办法执行sudo 问题

    由于主机名有重复的情况,所有需要更改主机名,遇到几个问题,主机名更改,重启系统以后不能执行sudo,另外也不知道root用户名密码.这个时候陷入了死循环. 网上搜集的办法,都是用sudo 命令去更改, ...

  4. vim 使用和配置

    vim 启动的时候,默认加载用户目录下.vimrc的配置文件,如果不存在,则会加载系统配置文件/etc/vim/vimrc ~/.vimrc文件配置 #避免中文乱码set fileencodings= ...

  5. 实力封装:Unity打包AssetBundle(三)

    前情提要:第二种打包方式 窗口初现 通过前面的两篇教程和一篇番外,我们已经完全实现了打包的功能.但是使用起来总是觉得有些晦涩别扭,如果不告诉别人怎么使用,对方肯定是一头雾水. What?你给我的这是啥 ...

  6. 互评Final版本

    作业要求[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2478] 基于NABCD评论作品,及改进建议 杨老师粉丝群.作品:<Pin ...

  7. 关于索引的相关 day45

    mysql数据库索引相关   一 介绍 什么是索引? 索引在MySQL中也叫做“键”,是存储引擎用于快速找到记录的一种数据结构.索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能 ...

  8. linux下关于PCL(point cloud library)库的安装,三行命令错误的问题

    最近想再看看PCL,所以进行了安装,在之前的接触的过程中,由于之前的网络存在问题,导致以下三个命令: sudo add-apt-repository ppa:v-launchpad-jochen-sp ...

  9. python 26个技巧

    26个你不知道的Python技巧   Python是目前世界上最流行的编程语言之一.因为: 1.它容易学习 2.它用途超广 3.它有非常多的开源支持(大量的模块和库) 不好意思,优达菌又啰嗦了. 本文 ...

  10. SSH连接虚拟机中的Ubuntu(转)

    摘要:主要是解决不能使用ssh远程Ubuntu的问题.使用的远程工具是putty.也可以使用xshell.ubunut12.0.4是装在虚拟机中的.不过这个应该没有什么影响. 一:问题的出现 前两天使 ...