600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 解决特殊字符引起json解析错误--单引号 双引号转义

解决特殊字符引起json解析错误--单引号 双引号转义

时间:2021-09-01 05:10:04

相关推荐

解决特殊字符引起json解析错误--单引号 双引号转义

解决特殊字符引起json解析错误–单引号、双引号转义

这几天在做一个题库管理,遇到了一个问题,将后台的json数据传到前台用parse解析时,出现了一个错误:

Uncaught SyntaxError: Invalid or unexpected token

at HTMLDocument. (batchEdit.action?qids[]=4200021952103424&qids[]=4200021953266688:619)

at j (jquery.min.js:2)

at Object.fireWith [as resolveWith] (jquery.min.js:2)

at Function.ready (jquery.min.js:2)

at HTMLDocument.I (jquery.min.js:2)

之前遇到这种问题,多是单引号与多引号不匹配或者括号匹配有问题,仔细检查发现这次不存在这种问题,后来查看batchEdit.action发现错误在下面这行

eval()解析json字符串出错,查询之后发现可能json字符串有特殊字符

json字符串为

var str = '{"chapter":"章节3","subject":"两次运行下面的程序,如果从键盘上分别输入6 和4,则输出结果是________________ \nmain( ) \n{ int x; \nscanf(\"%d\",&x);\nif(x++>5) \nprintf(\"%d\",x); \nelse \nprintf(\"%d\\n\",x--); } \n","pictureUrl":"","optionC":"7 和4","start":0,"optionD":"6 和4","optionA":"7 和5","optionB":"6 和3","analysis":"","rows":0,"type":"单选题","qid":4200021952103424,"difficulty":"困难","courseName":"C语言","answer":"A","optionG":"","optionE":"","optionF":"","courseId":4,"knowPoint":"知识点3-9"}';

在这篇博客中了解到

不管是单引号还是双引号,里面都可以套相反的引号,但是不可以双引号里面套单引号,这个单引号再套双引号,这是不行的。

如果在引号里面使用相同的引号,需要用 \ 转义。

单引号转义为\’

双引号转义为\"

后来参考博客在json字符串传入前台时进行以下处理:

str = str.replace("\"", "\\\"");str = str.replace("\'","\\\'");

到了这里,前台接收的字符串为

var str = '{\"chapter\":\"章节3\",\"subject\":\"两次运行下面的程序,如果从键盘上分别输入6 和4,则输出结果是________________ \nmain( ) \n{ int x; \nscanf(\\"%d\\",&x);\nif(x++>5) \nprintf(\\"%d\\",x); \nelse \nprintf(\\"%d\\n\\",x--); } \n\",\"pictureUrl\":\"\",\"optionC\":\"7 和4\",\"start\":0,\"optionD\":\"6 和4\",\"optionA\":\"7 和5\",\"optionB\":\"6 和3\",\"analysis\":\"\",\"rows\":0,\"type\":\"单选题\",\"qid\":4200021952103424,\"difficulty\":\"困难\",\"courseName\":\"C语言\",\"answer\":\"A\",\"optionG\":\"\",\"optionE\":\"\",\"optionF\":\"\",\"courseId\":4,\"knowPoint\":\"知识点3-9\"}';

到了这里,仍然同刚才相同的错误,是不是字符串还存在非法字符,字符串中的‘和“都被 转义,我有点怀疑是不是"\n"也需要转义,然后我就先把所有的"\n"全部删掉,然后重新测试,果然不出所料,问题就在"\n"这个位置,采用同样的方式在json字符串传到前台前,对字符进行转义。

str = str.replace("\\n", "\\\\n");

花费了一上午,终于把这个问题解决了,在此标记一下。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。