今天基于这个问题纠结了一下午,导致这个问题的坑也是挺深的,查找问题最好是从这条数据的存储开始查找

问题1:先确定后台接收数据后存储到数据库里有没有自动转义特殊字符,比如

原始数据是:[{"user_id":20,"good":true}],这样的一个对象数组

存入数据库是:[{"user_id":20,"good":true}]

说明数据经过后端的逻辑处理,把前端的数据转义存储了

解决这个问题,前端传参数组的时候先用JSON.stringify序列化数据,再交给后端,这样就不用管后端开发者怎么处理的数据了

那么,我是序列化后的数据打印看到的还是它:[{"user_id":20,"good":true}],只不过它已经是字符串了

后台存储自动转义的时候,其实就是把一些特殊字符做了一些处理,以免其它更多的bug出现

这里提供两个常用函数处理这种转义的字符串,如下

/**
 *  把html转义成HTML实体字符
 * @param str
 * @returns {string}
 * @constructor
 */
export let htmlEncode = (str) => {
  var s = "";
  if (str.length === 0) {
    return "";
  }
  s = str.replace(/&/g, "&");
  s = s.replace(/</g, "&lt;");
  s = s.replace(/>/g, "&gt;");
  s = s.replace(/ /g, "&nbsp;");
  s = s.replace(/\'/g, "&#39;");//IE下不支持实体名称
  s = s.replace(/\"/g, "&quot;");
  return s;
}

/**
 *  转义字符还原成html字符
 * @param str
 * @returns {string}
 * @constructor
 */
export let htmlRestore = (str) => {
  var s = "";
  if (str.length === 0) {
    return "";
  }
  s = str.replace(/&amp;/g, "&");
  s = s.replace(/&lt;/g, "<");
  s = s.replace(/&gt;/g, ">");
  s = s.replace(/&nbsp;/g, " ");
  s = s.replace(/&#39;/g, "\'");
  s = s.replace(/&quot;/g, "\"");
  return s;
}

所以,如果后台返回的数据打印是这样的:[object object],

前台是通过    

JSON.parse(item.good) 

无法解析数据,并且报错如下:

SyntaxError: JSON.parse: expected property name or '}' at line 1 column 3 of the JSON data

那你极可能遇到和我一样的问题

我的解决方案是:不动后台逻辑代码处理,前端加一个函数处理返回的数据,这个函数就是我上面分享的

JSON.parse(htmlRestore(item.good))

 

GitHub 加速计划 / js / json
41.72 K
6.61 K
下载
适用于现代 C++ 的 JSON。
最近提交(Master分支:1 个月前 )
960b763e 2 个月前
8c391e04 5 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐