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

标签 json node.js gruntjs

情况:

我在获取 JSON 文件中的用户名字符串以解析为具有正确值的 Javascript 对象时遇到困难。这是一个 grunt 任务,因此它使用 JSON.parse() 的 node.js 实现.

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

我们尝试过的:

我已经启动了一个 Node 实例,并运行了不同级别的反斜杠转义的一些排列,以了解如何处理这个问题。

(格式: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' } (欢迎来到疯狂镇。)

问题:

我们如何格式化 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

好吧-所以两个斜线应该是票证?但这给我们带来了意外的 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 - 解析包含 $ 的 JSON 文件会导致奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32184480/

相关文章:

javascript - Grunt 将其余调用重定向到文件

MySql表数据到JSON的转换

javascript - jsTree 为每个父扩展执行 ajax 请求

javascript - Express 和 SimpleHTTPServer 有什么区别

node.js - 为什么在 ES6 模块中导出的对象有未定义的方法?

gruntjs - Gruntwiredep可以缩小HTML文件中的版本吗

gruntjs - Grunt watch 警告 : EPERM, 不允许操作

java - Jackson 序列化程序在序列化后不显示 jsonInfoType

json - 在 URL 中以可读方式嵌入 JSON

node.js - Connect.js methodOverride 有什么作用?