解决特殊字符引起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");
花费了一上午,终于把这个问题解决了,在此标记一下。