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. 2018ICPC青岛 E - Plants vs. Zombies (二分+模拟)

    ZOJ - 4062 题意:有n个植物排成一排,按顺序植物的编号是1-n,每个植物都有一个生长速率,有一个机器人,机器人可以走m步,每走一步,这个机器人就会浇一次水,浇一次水那个植物就会长 自身的生长 ...

  2. Oracle包和包体

    一.什么要使用包? 在一个大型项目中,可能有很多模块,而每个模块又有自己的过程.函数等.而这些过程.函数默认是放在一起的(如在PL/SQL中,过程默认都是放在一起 的,即Procedures中),这些 ...

  3. SpringMVC学习二

    处理请求 今天学了三种请求,一种是 PathVariable ,一种是 RequestParam ,还有一种是CookieValue,并实现简单rest增删改查 上代码 package com.spr ...

  4. Effective Java Chapter4 Classes and Interface

    MInimize the accessibility of classes and members 这个叫做所谓的 information hiding ,这么做在于让程序耦合度更低,增加程序的健壮性 ...

  5. mysql随机查询记录的高效率方法

    mysql使用rand随机查询记录的高效率方法 一直以为mysql随机查询几条数据,就用 SELECT * FROM `table` ORDER BY RAND() LIMIT 5 就可以了. 但是真 ...

  6. ES6 函数的扩展-rest参数

    ES6 引入 rest 参数(形式为...变量名),用于获取函数的多余参数,这样就不需要使用arguments对象了.rest 参数搭配的变量是一个数组,该变量将多余的参数放入数组中. functio ...

  7. ES6 箭头函数--特性

    如果箭头表达式仅仅就是简化了函数的命名,我们为什么要改变原来的习惯而去使用它呢?所以我们需要了解一下箭头函数的特性. 箭头函数内部没有constructor方法,也没有prototype,所以不支持n ...

  8. Java并发机制和底层实现原理

    Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码转化为汇编指令在CPU上执行.Java中的并发机制依赖于JVM的实现和CPU的指令. Java语言规范第三版中 ...

  9. 河南省第四届ACM省赛(T3) 表达式求值

    表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min ...

  10. linux 系统命令和方法

    1.EXPORT EXPORT 依赖库===============export LD_LIBRARY_PATH=/opt/export LD_LIBRARY_PATH=/usrlib/ 2.查看分区 ...