parsing包含\ $的JSON文件会导致奇怪的行为
情况:
我在获取JSON文件中的用户名string时遇到困难,需要使用正确的值parsingJavascript对象。 这是一个棘手的任务,所以它使用JSON.parse()
的node.js实现。
我们有一个FTP用户名(由azure提供,不可更改),格式为"domain\$username"
。 我们需要一个Grunt任务来为FTP推送提供这个用户名格式。
我们试过的:
我已经启动了一个节点的实例,并运行了不同级别的反斜杠转义,看看如何处理这个。
(格式: Input
=> Parse Result
)
-
{ "user": "domain\$username" }
=>{ user: 'domain$username' }
(看起来像\ escapes $) -
{ "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的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给你的原始价值(我想这是有道理的,如果你考虑它)。