解析包含 \$ 的 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)

  1. { "user": "domain$username" } => { user: 'domain$username' }(好像 \ 转义了 $)
  2. { "user": "domain\$username" } => Unexpected token $(看来 $ 需要转义)
  3. { "user": "domain\$username" } => Unexpected token $(什么?!?)
  4. { "user": "domain\\$username" } => { user: 'domain\$username' }(所以反斜杠被转义了,现在 $ 不需要转义了?)
  5. { "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 实际上返回的是转义的结果,而不是原始值,而仅评估变量就会为您提供原始值(如果您考虑一下,我想这是有道理的)。

所以答案是使用四个斜杠。