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

时间:2015-08-24 14:11:58

标签: json node.js gruntjs

情况:

我在JSON文件中获取用户名字符串时难以解析为具有正确值的Javascript对象。这是一项艰巨的任务,因此它正在使用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。)
  6. 问题:

    我们如何格式化JSON文件中的用户名,以便node.js的解析器输出domain\$username

1 个答案:

答案 0 :(得分:0)

因此,让我们进行健全性检查

> 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实际上是返回转义的结果,而不是原始值,而只是评估变量会给你原始值(我想如果你考虑它就有意义)。

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