解析包含 \$ 的 JSON 文件会导致奇怪的行为
Parsing a JSON file containing \$ results in weird behavior
情况:
我很难将 JSON 文件中的用户名字符串解析为具有正确值的 Javascript 对象。这是一个 grunt 任务,所以它使用 JSON.parse()
.
的 node.js 实现
我们有一个 FTP 用户名(由 azure 提供,不可更改),格式为 "domain$username"
。我们需要 Grunt 任务以该格式提供此用户名以进行 FTP 推送。
我们尝试过的:
我已经启动了一个节点实例,运行 虽然不同级别的反斜杠的一些排列转义以查看如何处理这个。
(格式: Input
=> Parse Result
)
{ "user": "domain$username" }
=> { user: 'domain$username' }
(好像 \ 转义了 $)
{ "user": "domain\$username" }
=> Unexpected token $
(看来 $ 需要转义)
{ "user": "domain\$username" }
=> Unexpected token $
(什么?!?)
{ "user": "domain\\$username" }
=> { user: 'domain\$username' }
(所以反斜杠被转义了,现在 $ 不需要转义了?)
{ "user": "domain\\$username" }
=> {user: 'domain\$username' }
(欢迎来到 crazytown。)
问题:
我们如何格式化 JSON 文件中的用户名,以便 node.js 的解析器输出 domain$username
?
所以让我们做一个完整性检查
> var username = 'domain\$username'; console.log(username);
> domain$username
呵呵...
> var config = { user: 'domain\$username' }; console.log(config.user);
> domain$username
好的 - 那么两个斜线应该是门票?但这给了我们一个 unexpected token $
错误。
所以让我们尝试换一种方式 - 使用 JSON.stringify。
> var input = JSON.stringify({user:'domain\$username'}); console.log(input);
> {"user":"domain\$username"}
> var output = JSON.parse(input); console.log(output.user);
> domain$username
但等一下...
> input
> '{"user":"domain\\$username"}'
> output.user
> 'domain\$username'
所以 console.log
实际上返回的是转义的结果,而不是原始值,而仅评估变量就会为您提供原始值(如果您考虑一下,我想这是有道理的)。
所以答案是使用四个斜杠。
情况:
我很难将 JSON 文件中的用户名字符串解析为具有正确值的 Javascript 对象。这是一个 grunt 任务,所以它使用 JSON.parse()
.
我们有一个 FTP 用户名(由 azure 提供,不可更改),格式为 "domain$username"
。我们需要 Grunt 任务以该格式提供此用户名以进行 FTP 推送。
我们尝试过的:
我已经启动了一个节点实例,运行 虽然不同级别的反斜杠的一些排列转义以查看如何处理这个。
(格式: Input
=> Parse Result
)
{ "user": "domain$username" }
=>{ user: 'domain$username' }
(好像 \ 转义了 $){ "user": "domain\$username" }
=>Unexpected token $
(看来 $ 需要转义){ "user": "domain\$username" }
=>Unexpected token $
(什么?!?){ "user": "domain\\$username" }
=>{ user: 'domain\$username' }
(所以反斜杠被转义了,现在 $ 不需要转义了?){ "user": "domain\\$username" }
=>{user: 'domain\$username' }
(欢迎来到 crazytown。)
问题:
我们如何格式化 JSON 文件中的用户名,以便 node.js 的解析器输出 domain$username
?
所以让我们做一个完整性检查
> var username = 'domain\$username'; console.log(username);
> domain$username
呵呵...
> var config = { user: 'domain\$username' }; console.log(config.user);
> domain$username
好的 - 那么两个斜线应该是门票?但这给了我们一个 unexpected token $
错误。
所以让我们尝试换一种方式 - 使用 JSON.stringify。
> var input = JSON.stringify({user:'domain\$username'}); console.log(input);
> {"user":"domain\$username"}
> var output = JSON.parse(input); console.log(output.user);
> domain$username
但等一下...
> input
> '{"user":"domain\\$username"}'
> output.user
> 'domain\$username'
所以 console.log
实际上返回的是转义的结果,而不是原始值,而仅评估变量就会为您提供原始值(如果您考虑一下,我想这是有道理的)。