首页 > 解决方案 > 我得到一个对象作为字符串。如何转换?

问题描述

使用IMAP我收到一封电子邮件。
但是解析,我得到了这个:

{
  from: [ "name lastname <mygmail@gmail.com>" ],
  date: [ "Mon, 21 Jun 2021 13:41:51 +0500" ],
  subject: [ "hello" ]
}

问题是这是一个string,根本不是一个对象!
我不能利用这一点。如何将此字符串转换为对象?

JSON.parse()抛出错误消息:

UnhandledPromiseRejectionWarning: SyntaxError: Unexpected token f in JSON at position 141

标签: javascriptnode.jsimap

解决方案


正如其他人所指出的,因为这不是 JSON,所以您不能将其解析为 JSON。它看起来确实是一个 JavaScript 片段。

过去eval(customJavaScriptCode)会用于此,但它非常不安全,因此请避免使用它

一种更好、更安全(但不是防弹)的方法是在沙盒环境中运行 JavaScript。很难摆脱它。你这样做是这样的:

  1. 为您的对象添加前缀result = ,名称并不重要。
  2. 在沙箱中执行 JavaScript。
  3. 获取最后一条语句的值。
const vm = require('vm');

const script = new vm.Script('result = ' + `{
  from: [ "name lastname <mygmail@gmail.com>" ],
  date: [ "Mon, 21 Jun 2021 13:41:51 +0500" ],
  subject: [ "hello" ]
}`);

const lastStatementResult = script.runInNewContext();

console.log(lastStatementResult.subject[0] == "hello");

您现在以相对安全的方式将对象解析为 JS。


如果您需要的不仅仅是最后一条语句,您可以这样做:

const vm = require('vm');

const script = new vm.Script(`
  var foo = "bar";
  var baz = foo + "123";
`);

const context = {}; // will contain global variables from the script
script.runInNewContext(context);

console.log(context.foo + '123' === context.baz);

推荐阅读