【问题标题】:convert "converted" object string to JSON or Object将“转换”的对象字符串转换为 JSON 或 Object
【发布时间】:2011-06-14 10:51:00
【问题描述】:

我有以下问题,因为我升级了我的原型JS框架。

JSON 解析不再能够将此字符串转换为对象。

"{empty: false, ip: true}"

以前在 1.6 版中是可能的,现在它需要是一个“已验证”的 JSON 字符串,例如

'{"empty": false, "ip": true}'

但是如何将第一个示例转换回对象?

【问题讨论】:

    标签: javascript json prototypejs


    【解决方案1】:
    const dataWithQuotes = str.replace(/("(\\.|[^"])*"|'(\\.|[^'])*')|(\w+)\s*:/g, (all, string, strDouble, strSingle, jsonLabel) => {
      if (jsonLabel) {
        return `"${jsonLabel}": `;
      }
      return all;
    });
    
    return dataWithQuotes
    

    与上述类似的解决方案,但更新了箭头功能。

    【讨论】:

      【解决方案2】:

      json 解析器不接受第一个输入是有道理的,因为它是无效的 json。您在第一个示例中使用的是 javascript 对象表示法。可以使用eval() 函数将其转换为对象。

      var str = "({empty: false, ip: true})";
      var obj = eval(str);
      

      当然,只有在您保证将要执行的代码被保存时,您才应该这样做。 您可以找到有关 json 规范 here 的更多信息。可以找到一个 json 验证器 here

      编辑:上面的泰语答案可能是一个更好的解决方案

      【讨论】:

      • 您需要添加括号,以便 JavaScript 引擎将其视为对象,而不是块。 eval('(' + str + ')').
      【解决方案3】:

      JSON 需要引用所有键,因此:

      "{empty: false, ip: true}"
      

      不是有效的 JSON。您需要对其进行预处理才能解析此 JSON。

      function preprocessJSON(str) {
      
          return str.replace(/("(\\.|[^"])*"|'(\\.|[^'])*')|(\w+)\s*:/g,
          function(all, string, strDouble, strSingle, jsonLabel) {
              if (jsonLabel) {
                  return '"' + jsonLabel + '": ';
              }
              return all;
          });
      
      }
      

      (Try on JSFiddle) 它使用一个简单的正则表达式替换一个单词,后跟冒号,该单词用双引号括起来。正则表达式不会引用其他字符串中的标签。

      那你就可以放心了

      data = JSON.parse(preprocessJSON(json));
      

      【讨论】:

      • 感谢您的快速响应,但我得到一个 SyntaxError: unterminated parenthetical,我无法弄清楚我猜正则表达式以某种方式输入错误......
      • 你是对的。我更正了正则表达式。我在发布之前以某种方式意外删除了右括号,现在已修复。感谢您发现这一点!
      • 是的,现在它可以工作了,非常感谢 - 这个解决方案可能比 eval 连接更好:)
      • 天才,谢谢。我希望我在走上死胡同之前更彻底地搜索过你的剧本!
      猜你喜欢
      • 1970-01-01
      • 2019-08-27
      • 2020-05-27
      • 1970-01-01
      • 2011-04-23
      • 2012-06-14
      • 2012-02-20
      • 2015-01-03
      相关资源
      最近更新 更多