【问题标题】:JSON.stringify() a string which is actual NodeJS codeJSON.stringify() 一个字符串,它是实际的 NodeJS 代码
【发布时间】:2016-12-29 14:27:58
【问题描述】:

我正在使用 NodeJS 中的 Readline 模块,并希望将用户编写的内容解析为代码。意思是如果有人写:

{
    name: "David",
    age: 34
}

我应该可以JSON.stringify(content) 并得到:

{
    "name": "David",
    "age": "34"
}

如何将字符串转换为实际代码,以便将其解释为 JavaScript 对象,从而使用 JSON.stringify() 将其转换为 JSON?

【问题讨论】:

  • 你可以让他们输入有效的 JSON,这样你就不必评估字符串了吗?评估不受信任的代码可能是不安全的......
  • 我正在构建一个命令行工具,所以除非用户想要制动自己的机器,否则欢迎他或她这样做:P
  • 只需要有效的 JSON 似乎仍然更容易。
  • 该工具的重点是将JS对象转换为JSON,如果您有大而复杂的对象,您就不必手动操作。计算机 FTW ;)
  • 也许是图书馆? github.com/freethenation/durable-json-lint 或正则表达式:stackoverflow.com/questions/18280279/… 我知道在浏览器中执行新的 Function hack 以转换对象...只是提供其他想法。

标签: node.js


【解决方案1】:

您的要求并不完全清楚,但是,JSON.parse() 会在这里为您提供帮助吗?如果输入不是有效的 JSON,您需要将其包装在 try catch 中。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse

【讨论】:

  • o_O 有点困惑;)接缝很清楚我在问什么,最后有一个问题(我可能听错了)。无论如何,JSON.parse() 用于将 JSON 转换为 JavaScript 对象。我的问题是我输入的内容被格式化为 JavaScript 对象。但是 process.stdin 给了我 ASCII 而不是 JavaScript。不知道该怎么说:(希望现在这更有意义。
  • 好的,我认为这可以解决问题。如果您的输入是字符串, JSON.parse() 会将其转换为 JavaScript 对象。不过,我在这里看到的是您的输入不是有效的 JSON(属性名称周围缺少引号)。如您所述, JSON.stringify() 将 JavaScript 对象作为输入并输出字符串。鉴于在这种情况下您的输入不是 JSON,它不会像您预期的那样工作。
  • 真的,这是一个错字。固定的。但我想我找到了解决方案。我马上贴出来。
【解决方案2】:

完成这项工作的诀窍是以未记录的方式使用 VM 模块,如下所示。

let vm = require('vm');

let script = new vm.Script('x = ' + full_content);

let sandbox = script.runInThisContext();

converted = JSON.stringify(sandbox);

基本上,您必须创建一个变量来保存您的字符串 (JavaScript),然后通过 .runInThisContext() 将其转换为正确的 JavaScript 代码。

在这种情况下,x 变量将“消失”,您不必考虑这一点。但是,如果您遵循 NodeJS 文档 example,并使用 .runInNewContext(),那么 x 变量不会消失,您会将对象(至少在我的情况下)分配给 x 变量。

希望这会有所帮助:)

【讨论】:

  • 感谢 2 小时从屏幕开始并尝试开箱即用 :D ps。如果您认为这是一个很好的答案,那么 + 会很好;)
  • 然后输入(function(){ x=0; while(true) x++;})() 的人会杀死虚拟机吗?
  • 他们的机器会生虫,适合漫长而黑暗的冬夜;)
  • 您可以设置超时以避免无限循环。使用 VM 处理错误的方法有多种。
猜你喜欢
  • 1970-01-01
  • 2015-07-10
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 2013-05-24
  • 1970-01-01
  • 2022-09-28
相关资源
最近更新 更多