cqwcns 发表于 2019-12-16 13:37

JSON字串中特殊字符转义

本帖最后由 cqwcns 于 2019-12-16 13:42 编辑

前端有个INPUT用于用户输入数据,点提交后数据会转为JSON(JSON.parse),写入JSON数组。


但如果用户输入的内容包含"或'时,JSON.parse会报错。


我一开始尝试用.replace(/"/g, '')和.replace(/'/g, '')将符号删掉,但显然这不是最好的办法。


我希望通过类似转义的方式,用户输入的特殊字符都能成功JSON.parse。
然后我尝试这样.replace(/"/g, "\'")和.replace(/'/g, '\"'),但发现这样是不行的。

求转义方法。


逍遥一仙 发表于 2019-12-16 13:59

转base64呗

coolcalf 发表于 2019-12-16 14:01

这货应该是取决于你用哪一个json工具库, 不同的库对其的支持不同。
曾经遇到过一个空格问题, 居然序列化时被json把空格给干掉了。

414269678 发表于 2019-12-16 14:03

封装一个方法。
序列化前把单引号和双引号分别替换为自定义的字符。
反序列化后再把自定的字符替换会对应的符号。

落神 发表于 2019-12-16 14:21

。。发完整点这条语句 不好看清楚 引号这些

小非凡 发表于 2019-12-16 14:30

cqwcns 发表于 2019-12-16 15:00

我发现这样可以解决这个问题。如下:
.replace(/\"/g, "\\\"");
.replace(/\'/g,"\\\'");

T1M 发表于 2019-12-16 16:23

本帖最后由 T1M 于 2019-12-16 16:27 编辑

作为一个非专业前端,感觉如果要硬转eval更不易出错,比如下面
json="{'t':'test\"'}";eval('('+json+')');// 正常转
json="{'t':'test\"'}";JSON.parse(json);// 报错

不过遇到换行之类的eval还是会报错,需要二次转义
json="{'t':'test\"\n'}".replace(/\n/g,"\\n").replace(/\r/g,"\\r");eval('('+json+')');
参考:https://www.cnblogs.com/alsf/p/8662189.html

一般用JSON.parse的地方都是可以确保没有特殊符号的json字符串

个人认为最稳妥的办法是限制前端输入,不要直接输入json。可以这样
json={};json.t="test\"\n";json;

cqwcns 发表于 2019-12-16 18:14

T1M 发表于 2019-12-16 16:23
作为一个非专业前端,感觉如果要硬转eval更不易出错,比如下面
json="{'t':'test\"'}";eval('('+json+')') ...

谢谢指导
页: [1]
查看完整版本: JSON字串中特殊字符转义