今天基于这个问题纠结了一下午,导致这个问题的坑也是挺深的,查找问题最好是从这条数据的存储开始查找
问题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, "<");s = s.replace(/>/g, ">");s = s.replace(/ /g, " ");s = s.replace(/\'/g, "'");//IE下不支持实体名称s = s.replace(/\"/g, """);return s;
}/*** 转义字符还原成html字符* @param str* @returns {string}* @constructor*/
export let htmlRestore = (str) => {var s = "";if (str.length === 0) {return "";}s = str.replace(/&/g, "&");s = s.replace(/</g, "<");s = s.replace(/>/g, ">");s = s.replace(/ /g, " ");s = s.replace(/'/g, "\'");s = s.replace(/"/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))