在 JSON 中解析反斜杠转义序列时出错



我正在尝试解析从API获得的JSON字符串:

var inputString = '{ "AccountName": "NT AUTHORITY\SYSTEM"}'
console.log(JSON.parse(inputString)) // View in browser console to see real error

上面的代码给出了错误:

未捕获的语法错误:JSON中位置31处出现意外的标记S at JSON.parse (( 在节目.html:7

现在下面的代码工作:

var inputString = '{ "AccountName": "NT AUTHORITY\\SYSTEM"}'
console.log(JSON.parse(inputString))

它显示输出:

{AccountName: "NT AUTHORITYSYSTEM"}

反斜杠字符是 JSON 中的转义序列。但是为什么我需要四个反斜杠来创建单个反斜杠?不应该只有\吗?

我从被调用的 API 获得的 JSON 响应只给了我两个\有路径的地方。所以我的代码坏了。我相信API的JSON格式是正确的。当我尝试在在线 JSON 查看器上解析此响应时,他们能够成功解析它。

首先,解析模板文本。就像在普通字符串中一样,双反斜杠被转换为单个文字反斜杠。所以,你的初始inputString

var inputString = `{ "AccountName": "NT AUTHORITY\SYSTEM"}`

将有一个反斜杠。

console.log(`\`.length);

与普通的Javascript字符串(其中忽略不必要的反斜杠(不同,JSON格式要求反斜杠位于要转义的特殊字符之前(如"或其他(。如果反斜杠和以下字符转换为转义字符,则会抛出类似您在问题中看到的SyntaxError

因此,要指示 JSON 中的文字反斜杠,您需要在 JSON 中使用两个反斜杠,而要在 Javascript 字符串中指示文字反斜杠,您还需要两个反斜杠。总之,您需要四个反斜杠才能指示 JSON 中的文字反斜杠。

如果您希望手动编写包含文本反斜杠的字符串,并且不需要使用转义字符,则可以考虑对模板文本使用String.raw,这会将单个反斜杠解析为文本反斜杠,而不是转义序列的一部分:

console.log(
String.raw`\`.length
);
const inputString = String.raw`{ "AccountName": "NT AUTHORITY\SYSTEM"}`;
console.log(JSON.parse(inputString))

模板字符串中有字符串。一个反斜杠由模板字符串使用,另一个反斜杠用于引用文本

最新更新