【问题标题】:How to parse a NON JSON STRING to a Object in javascript如何将非 JSON 字符串解析为 javascript 中的对象
【发布时间】:2021-04-07 15:43:54
【问题描述】:

我在将非 json 对象字符串解析为 javascript 中的实际对象时遇到问题

示例字符串如下所示:

let objString = '{ one: [1, 2, 3], num: 1 }';

我希望它看起来像

obj = { one: [1, 2, 3], num: 1 };

到目前为止我已经尝试过:

  • JSON.stringify 然后 JSON.parse
  • JSON.parse
  • 评估

由于相当明显的原因,这些都不起作用,但我被困在如何实现这一点上,这是我正在编写的用于运行和评估代码的类,下面是相关方法的 sn-p。

compare() {
  const { testCaseInfo, stdout } = this;
  const expected = testCaseInfo.expected;
  if (this.err || stdout.length < 1) { return false };

  let parsedAnswer = stdout;
  parsedAnswer = parsedAnswer.split('\n').join('');
  
  /* Need help here, some edge case of Obj strings */
  if (parsedAnswer.indexOf('{')) {

  }
  // This works for everything else
  parsedAnswer = JSON.parse(parsedAnswer);

  this.output = parsedAnswer;
  
  return _.isEqual(parsedAnswer, expected);
}

【问题讨论】:

  • 这是一个非常 X/Y 的问题。可能,但如果可行,我真的建议考虑另一种方法
  • 尝试将所有 ' 替换为 " like objectString.replace(/(['"])?([a-z0-9A-Z_]+)(['"])?:/g, '"$2": ');
  • 您是否可以控制objString 的生成方式? JSON.parse('{ "one": [1, 2, 3], "num": 1 }') 与键周围的引号一起使用。如果没有,您可能需要考虑清理您的 JSON。 stackoverflow.com/questions/9637517/…
  • @wahoowa 原始文本实际上是从执行文件的标准输出中收集的,因此它已经以字符串形式出现,而不是 JSON 格式。 :(
  • @fortunee 谢谢你的想法,遗憾的是没有工作。

标签: javascript


【解决方案1】:

用括号括起来。

let objString = '{ one: [1, 2, 3], num: 1 }';
let obj = eval('(' + objString + ')');

不过,不用说,您应该只 eval 来自受信任来源的东西。

【讨论】:

    【解决方案2】:

    我找到了一个非常厚颜无耻的方法

    let obj = {}
    eval("obj =" + '{ one: [1, 2, 3], num: 1 }')
    

    【讨论】:

      【解决方案3】:

      由于使用eval() 存在安全风险。我建议您尝试将您的字符串转换为可解析的 JSON 字符串,然后使用 JSON.parse() 进行解析。

      const keyFinderRegEX = /([{,]\s*)(\S+)\s*(:)/mg;
      const convertedJSONString = '{ one: [1, 2, 3], num: 1 }'.replace(keyFinderRegEX, '$1"$2"$3');
      const parsedObj = JSON.parse(convertedJSONString);
      
          console.log(parsedObj)

      【讨论】:

        【解决方案4】:

        将您的字符串转换为下面的这种格式,它应该使用 JSON.parse() 正确解析

        let objString = '{ "one": [1, 2, 3], "num": 1 }';
        
        console.log(JSON.parse(objString));

        【讨论】:

        • 我该怎么做呢,我认为这是一种方法,但实际上开发一个功能来实现这一点似乎非常困难......
        • 你可以试试这样的JSON.parse('{ one: [1, 2, 3], num: 1 }'.replace(/([{,]\s*)(\S+)\s*(:)/mg, '$1"$2"$3'))
        猜你喜欢
        • 1970-01-01
        • 2013-05-12
        • 2017-03-24
        • 1970-01-01
        • 2013-03-12
        • 1970-01-01
        • 1970-01-01
        • 2019-07-12
        • 1970-01-01
        相关资源
        最近更新 更多