简介:
在实际项目中我们需要将一些数据将以字符串的形式存储到数据库中,比如:
'{ "name":"张三 ", "gender":"这是个对象,里面有test}'; |
等需要调用时,使用 JSON.parse()再转换回需要的数据格式,但是今天我调用使用JSON.parse()转换时这里报了错误
"SyntaxError: Bad control character in string literal in JSON at position 579
问题分析:
第一反应就是字符串出了问题但是去数据库中查看了下字符串,并且把字符串copy出来,自己写了个demo转换了下,发现并没问题竟然能够转换成功。
这就比较郁闷了,然后我去网上搜了类似的问题大概就是 字符串中含有含有不可转义字符 然后我突然想到会不会是 在界面输入字符串的时候敲了个回车的原因。毕竟回车在字符串转义的时候会变成 --- \n --- ,然后我就立刻写了个demo试验了下 还真是
然后知道问题所在之后就简单了:
this.form = JSON.parse(str.replace('\n', '\\n'))
知识点疑问和总结:
我记得学c的时候 转义字符明明是 \ 为什么这里 却用 \\作为转义符?
原来JSON.parse的参数包含转移字符的时候会遇到两次转义,其实第一次是字符串本身的转义,第二次是将真正转为js对象的转义。
举个例子:
let str ='{ "name":"张三 ", "gender":"这是个对象,里面有\\"test\\"}';
第一次转义字符串自身转义为:
'{ "name":"张三 ", "gender":"这是个对象,里面有\"test\"}'
第二次真正对应字符串转对象时的转义:
同样的其他特殊字符:
1.\n,如想想出现正确的换行需要json字符串中是\\n,其实是先对\n中的\转义,n变成了普通字符,在解析为js对象的时候n与之前的\(只有一个\了)被解释为换行。如下的两个与此类似。
2.\r,\\r
3.\t,\\t
转义字符\r、\n、以及\r\n的区别:
\r :将当前位置移到本行开头。又叫回车
\n:将当前位置移到下一行开头。又叫换行,在 UNIX、Linux 和 macOS 系统中,\n
用作行的结束符。\r\n:表示回车并换行在 Windows 系统(及其兼容系统)中,
\r\n
用作行的结束符我们可以看下上面的结论对不对 使用我其他文章推荐的 nodepad++ 任意打开一个文件:
引入三个概念哈 ,CR、LF、CRLF。
CR:Carriage Return,对应ASCII中转义字符**\r**,表示回车
LF:Linefeed,对应ASCII中转义字符**\n**,表示换行
CRLF:Carriage Return & Linefeed,\r\n,表示回车并换行
以上是我项目中遇到的问题和浅显的理解记录,如果发现什么问题,欢迎留言,大家一起交流进步。