【问题标题】:I get an object as a string. How to convert?我得到一个对象作为字符串。如何转换?
【发布时间】:2021-09-05 02:10:27
【问题描述】:

使用 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

【问题讨论】:

  • 您发布的内容不是 JSON 字符串,例如from 将是 "from"
  • 不会将其转换为字符串然后返回产生相同的结果吗?我相当肯定你正在尝试的东西没有意义。只需将其用作对象,即imap.from 以列出发件人地址等。如果您需要将其作为有效负载传递给 REST API 或类似内容,请使用 JSON.stringify
  • 请添加更多代码以显示您如何接收字符串以及如何解析它,这将有助于我们了解更多
  • 您发布的内容不是 IMAP,甚至接近它。 IMAP ⓐ 不使用 JSON 并且 ⓑ 结构不同(例如 from 将进一步细分为地址和显示名称)。如果这是一个 IMAP 问题,请详细说明。如果不是,请更改标签。
  • 这是您期望做的事情吗?我已经复制了您拥有的数据并尝试进行字符串化和解析 jsfiddle.net/7yp05zqd

标签: javascript node.js imap


【解决方案1】:

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

过去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);

【讨论】:

    【解决方案2】:

    我没有正确理解你的问题。

    试试这个

    JSON.stringify(JSON.parse(Object))
    

    如果存在错误,请详细描述您的问题

    【讨论】:

    • 不懂的请不要回答。如果需要更多详细信息,请在问题下方的 cmets 中询问,并将其标记为“需要详细信息或说明”。
    【解决方案3】:

    您会收到该错误,因为在 JSON 表示法中,属性应该用双引号括起来,如下所示:

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

    所以,如果你得到的是一个像你展示的那样的字符串,你必须自己添加这些双引号(也许用一个不错的coolio正则表达式)

    【讨论】:

    • 也许有一个不错的coolio正则表达式”无效的JSON和正则表达式不能很好地协同工作。
    • @Ivar 但是,按照 Ppicom 的回答,我已经解决了我的问题。
    • @Ivar 是的,你是对的。如果所有属性都已知,也许每个属性的replace 会更好。但我很好奇,你介意解释一下为什么正则表达式不起作用吗? :D
    • @ppicom 您可能将 JSON 编码为 JSON 本身内部的字符串值。祝你好运,找出你应该在哪些键上添加引号,以及哪些键是你应该不理会的字符串的一部分。这可能是可能的,但从源头上解决问题几乎总是更好。 (或者在这里您甚至可以考虑使用 JavaScript 引擎来解析对象,然后再次对其进行字符串化。)也就是说,如果它 is 实际上是一个有效的 JS 对象。如果你的 JSON 编码不正确,谁说它没有其他问题?
    • 哦,对了,我明白了!我假设 OP 无法修改他收到的字符串。
    猜你喜欢
    • 2019-12-17
    • 2021-02-03
    • 2013-11-12
    • 2018-07-19
    • 2019-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多