parsing包含\ $的JSON文件会导致奇怪的行为

情况:

我在获取JSON文件中的用户名string时遇到困难,需要使用正确的值parsingJavascript对象。 这是一个棘手的任务,所以它使用JSON.parse()的node.js实现。

我们有一个FTP用户名(由azure提供,不可更改),格式为"domain\$username" 。 我们需要一个Grunt任务来为FTP推送提供这个用户名格式。

我们试过的:

我已经启动了一个节点的实例,并运行了不同级别的反斜杠转义,看看如何处理这个。

(格式: Input => Parse Result

  1. { "user": "domain\$username" } => { user: 'domain$username' } (看起来像\ escapes $)
  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的parsing器输出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实际上是返回转义的结果,而不是原始值,而只是评估variables给你的原始价值(我想这是有道理的,如果你考虑它)。

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