我正在尝试解析从API获得的JSON字符串:
var inputString = '{ "AccountName": "NT AUTHORITY\\SYSTEM"}'
console.log(JSON.parse(inputString)) // View in browser console to see real error
上面的代码给出了错误:
未捕获的SyntaxError:JSON中位置31处的意外令牌S 在JSON.parse() 在program.html:7
现在下面的代码有效:
var inputString = '{ "AccountName": "NT AUTHORITY\\\\SYSTEM"}'
console.log(JSON.parse(inputString))
它显示输出:
{AccountName: "NT AUTHORITY\SYSTEM"}
反斜杠字符是JSON中的转义序列。但是,为什么我需要四个反斜杠才能创建一个反斜杠?不应该只是\\
吗?
我从被调用的API获得的JSON响应仅在有路径的地方给了我两个\\
。所以我的代码坏了。我相信API的JSON格式是正确的。当我尝试在线JSON viewer上解析此响应时,他们便能够成功解析它。
答案 0 :(得分:3)
首先,解析模板文字。就像在普通字符串中一样,双反斜杠被转换为单个 literal 反斜杠。因此,您的初始inputString
:
var inputString = `{ "AccountName": "NT AUTHORITY\\SYSTEM"}`
其中将包含一个单反斜杠。
console.log(`\\`.length);
与普通的Javascript字符串(其中不必要的反斜杠将被忽略)不同,JSON格式需要,反斜杠位于要转义的特殊字符之前(例如"
或另一个{{1} }。如果反斜杠和后面的字符不能转换为转义字符,则会抛出一个\
,就像您在问题中看到的一样。
因此,要在JSON中指示文字反斜杠,则在JSON中需要两个反斜杠,而在Javascript字符串中指示文字反斜杠,还需要两个反斜杠。总之,您需要四个反斜杠,以便在JSON中指示文字反斜杠。
如果您希望手动编写包含 literal 反斜杠的字符串,并且不需要使用转义字符,则可以考虑对模板文字使用SyntaxError
来解析单个反斜杠是文字反斜杠,而不是转义序列的一部分:
String.raw
答案 1 :(得分:0)
模板字符串中包含字符串。模板字符串使用一个反斜杠,另一个用于引号的文本