【问题标题】:Parsing a JSON file containing \$ results in weird behavior解析包含 \$ 的 JSON 文件会导致奇怪的行为
【发布时间】:2015-08-24 14:11:58
【问题描述】:

情况:

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

我们有一个格式为 "domain\$username" 的 FTP 用户名(由 azure 提供,不可更改)。我们需要一个 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' }(欢迎来到疯狂小镇。)

问题:

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

【问题讨论】:

  • 使用 3 个反斜杠对我来说效果很好:console.log(JSON.parse(JSON.stringify({user: "domain\\\$username"})).user) 输出:domain\$username
  • 这很奇怪,也许你可以发送一个特殊的字符链,当你得到 json 时将其替换为'$'。像“theMoneyCharacter”这样的东西。如果您需要快速回答,因为这是在浪费程序时间。 3 '\' 应该可以正常工作。
  • 据我所知 $ 不需要转义,但 \ 确实应该是两个反斜杠 \\$
  • 你们是在浏览器窗口还是在节点实例中执行这些操作?
  • 如果您手动创建字符串,则需要将反斜杠转义两次。 domain\\\\$username 这导致:​​domain\\$username 在 json 字符串中,然后当它被解析为 JSON -> 对象时,它变成 "domain\$username" 并且,浏览器给出了你在节点环境中遇到的所有相同问题在这种情况下。

标签: json node.js gruntjs


【解决方案1】:

让我们做一个健全性检查

> 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 实际上是返回转义的结果,而不是原始值,而仅评估变量会给您原始值(我想如果您考虑一下,这是有道理的)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-16
    • 2023-04-04
    • 2013-04-26
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    相关资源
    最近更新 更多