【问题标题】:Best way to convert string to array of object in javascript?在javascript中将字符串转换为对象数组的最佳方法?
【发布时间】:2011-03-29 06:26:07
【问题描述】:

我想将下面的字符串转换为 javascript 中的数组。

{a:12, b:c, foo:bar}

如何将此字符串转换为对象数组?有什么好主意吗?

【问题讨论】:

  • 这个数组会是什么样子?
  • 这看起来很像 JSON。这本身就很像一个关联数组,可以这样访问。你知道吗? [看这里](hunlock.com/blogs/….
  • 它不是一个数组。这是一个单一的字符串。我只是从标签属性中获取这个字符串。我想将此字符串转换为数组。
  • 他们所说的是对象的功能很像 javascript 中的数组,如果您将键/值括在单引号中并使用 @987654323,那么您提供的示例实际上会创建一个 javascript 对象@就可以了。
  • 我假设您的意思是 {a: 12, b: "c", foo: "bar"} ... 除非 cbar 实际上是当前范围内的变量,而不是字符串。

标签: javascript jquery arrays literals string-literals


【解决方案1】:

最简单但不安全的方法是:

eval('(' + myJSONtext + ')')

但由于这将解释任何 javascript 代码,因此存在安全漏洞。为了防止这种情况,请使用 json 解析器。如果您使用的是框架(jquery、mootools 等),则有一个特定于框架的调用。其中大部分基于 Douglas Crawford 的解析器,地址为 http://www.json.org/js.html

【讨论】:

    【解决方案2】:

    你可以使用“for in”

    var myObject = {a:'12', b:'c', foo:'bar'};
    var myArray = [];
    
    for(key in myObject) {
        var value = myObject[key];
        myArray[key] = value;
    }
    
    myArray['a']; // returns 12
    

    注意:考虑到 myObject 只有一层键值对。

    【讨论】:

    • 如果你真的想使用字符串,把第一行改成 var myObject = eval('(' + "{a:'12', b:'c', foo:'bar'} " + ')');,使用@Rob 提示。
    【解决方案3】:

    我认为最好的方法是使用 Douglas Crockford(最大的 JavaScript 大师之一)suggests in here,因为它不仅比 eval() 快,而且更安全。

    原生 JSON 解析器已在:

    • 火狐3.5+
    • IE 8+
    • Opera 10.5+
    • Safari Safari 4.0.3+
    • Chrome(不知道哪个版本)

    Crockford 在 javascript 中做了一个安全的回退,称为 json2.js,它是对 eval() 方法的改编,添加了一些安全位并使用本机 JSON 解析器 API。您只需要包含该文件,删除它的第一行,然后使用本机 JSON 解析器,如果它不存在,json2 就可以完成这项工作。

    这是一个例子:

    var myJSONString = '{ "a": 1, "b": 2 }',
        myObject = JSON.parse(myJSONString);
    

    解析后,您将获得一个具有ab 属性的对象,并且您可能知道,您可以将对象视为哈希表或JavaScript 中的associative array,这样您就可以访问像这样的值:

    myObject['a'];
    

    如果您只想要一个简单的数组而不是关联数组,您可以执行以下操作:

    var myArray = [];
    for(var i in myObject) {
        myArray.push(myObject[i]);
    }
    

    最后,虽然在纯 JavaScript 中不是必需的,JSON spec 需要双引号成员的键。所以没有它,navite 解析器将无法工作。如果我是你,我会添加它,但如果不可能,请使用 var myObject = eval( "(" + myString + ")" ); 方法。

    【讨论】:

    • 什么是 var myObject = eval( "(" + myString + ")" );意思是?非常感谢。
    • eval() 将字符串解析为 JavaScript 源,并且由于所有有效的 JSON 也是有效的 JavaScript(它来自 JavaScript Object Notation),您可以使用 eval() 将其转换为 JavaScript 表示.出于安全原因,在字符串的开头和结尾添加父母是一种常见的做法,尽管使用 eval() 仍然非常不安全。所以, var myObject = eval( "(" + myString + ")" );只是解析 myString JSON 并在 myObject 变量(可能是对象或数组)中获取它的值
    • 请注意,json2 仍然使用 eval,但会执行一些检查以缓解潜在漏洞
    【解决方案4】:

    如果您使用的是 jQuery,则可以使用 $.parseJSON() 函数。如果字符串格式错误,它会抛出异常,并且“另外,如果你什么都不传递,一个空字符串、null 或未定义,'null' 将从 parseJSON 返回。浏览器提供 JSON.parse 的本机实现,jQuery用它来解析字符串”

    【讨论】:

      【解决方案5】:

      由于您的字符串是格式错误 JSON,因此 JSON 解析器无法正确解析它,甚至 eval() 也会抛出错误。它也不是一个 Array 而是一个 HashMap 或者只是一个 Object 文字(格式错误)。如果 Object 文字只包含数字和字符串值(并且没有子对象/数组),您可以使用以下代码。

      function malformedJSON2Array (tar) {
          var arr = [];
          tar = tar.replace(/^\{|\}$/g,'').split(',');
          for(var i=0,cur,pair;cur=tar[i];i++){
              arr[i] = {};
              pair = cur.split(':');
              arr[i][pair[0]] = /^\d*$/.test(pair[1]) ? +pair[1] : pair[1];
          }
          return arr;
      }
      
      malformedJSON2Array("{a:12, b:c, foo:bar}");
      // result -> [{a:12},{b:'c'},{foo:'bar'}]
      

      该代码会将您的字符串转换为对象数组(复数)。

      如果您实际上想要一个 HashMap(关联数组)而不是数组,请使用以下代码:

      function malformedJSON2Object(tar) {
          var obj = {};
          tar = tar.replace(/^\{|\}$/g,'').split(',');
          for(var i=0,cur,pair;cur=tar[i];i++){
              pair = cur.split(':');
              obj[pair[0]] = /^\d*$/.test(pair[1]) ? +pair[1] : pair[1];
          }
          return obj;
      }
      
      malformedJSON2Object("{a:12, b:c, foo:bar}");
      // result -> {a:12,b:'c',foo:'bar'}
      

      当你开始嵌套对象和数组时,上面的代码会变得复杂很多。基本上你必须重写 JSON.jsJSON2.js 来支持格式错误的 JSON。

      还可以考虑以下选项,我承认这仍然很糟糕,但比将 JSON 粘贴在 HTML 标记的属性中要好一点。

      <div id="DATA001">bla</div>
      <!-- namespacing your data is even better! -->
      <script>var DATA001 = {a:12,b:"c",foo:"bar"};</script>
      

      我假设您在字符串中省略了引号,因为您已将它放在 HTML 标记的属性中并且不想转义引号。

      【讨论】:

        【解决方案6】:

        JSON.parse 可以解决问题。解析后,您可以将它们推送到数组中。

        var object = JSON.parse(param);
        var array = [];
        for(var i in object) {
           array.push(object[i]);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-03-01
          • 1970-01-01
          • 2021-08-03
          • 1970-01-01
          • 2018-05-28
          • 2014-06-21
          • 2013-09-20
          • 2011-08-11
          相关资源
          最近更新 更多