【问题标题】:Parsing a JSON string to array, not object将 JSON 字符串解析为数组,而不是对象
【发布时间】:2011-10-29 02:33:09
【问题描述】:

我有一个 PHP 数组并使用 json 编码将其回显到 javascript 中,我需要这样做,因为它会非常动态。这是它回显的代码:

{"notempty":true}

我用它把它转换成javascript:

var myarray = eval('(' + json + ')');

由于某种原因,它创建了一个对象而不是数组,因此我不能使用 .length 或 for 循环。

有人知道我在这里做错了什么吗?

谢谢

【问题讨论】:

  • 在 JS 枚举数组(或 PHP 中的枚举数组)中的行为类似于对象
  • 原因是 JavaScript 中不能有关联数组。对象是最接近的匹配项。
  • 不要使用 eval。使用像 jQuery 的 api.jquery.com/jQuery.parseJSON 这样的 JSON 解析方法或使用 Douglas Crockford 的 parseJSON 方法。见github.com/douglascrockford/JSON-js(下载json2.js)

标签: php javascript arrays json object


【解决方案1】:

您可以使用 jQuery 将其解析成这样的数组:

var p = [];
$.each(jsonData, function (key, val) {
    p.push([val.propertyOne, val.propertyTwo]);
});

我当然假设您要解析 JSON,而不是数组或任何其他字符串。

【讨论】:

    【解决方案2】:

    您试图将Object 视为Array,而Object 不是Array,它是Object

    任何时候您在 JSON 中看到 {},这意味着“包含在这些神圣括号中的是一个动态对象”。当你看到[] 时,它的意思是“看哪!我是一个数组”(这个有明显的例外:jQuery 做了一些特殊的工作以使自己看起来像一个数组)。

    因此,为了遍历 Object,您需要使用 for... in

    // eval BAD unless you know your input has been sanitized!.
    var myObj = JSON.parse('{"notempty":true}');
    // personally, I use it in for... in loops. It clarifies that this is a string
    // you may want to use hasOwnProperty here as sometimes other "keys" are inserted
    for( var it in myObj ) console.log( "myObj["+it+"] = " + myObj[it] );
    

    【讨论】:

    • 在遍历对象属性时不要忘记使用hasOwnPropertyfor (var it in myObj) if(myObj.hasOwnProperty(it)) {do something}
    • 非常感谢,告诉我循环对象的方法完全解决了我的问题。
    【解决方案3】:

    默认情况下,如果你在 php 中使用 encode 一个 assoc 数组,当你解码时它会变成一个 js 对象。为了让它成为一个数组,你需要在 php 中使它成为一个数组:

    PHP:

    $arr = "['notempty','notempty2','notempty3']";
    

    否则,您应该将其转换为 JS 中的数组,但这在我看来是一种浪费,因为在 javascript 中循环遍历对象要容易得多:

    Javascript:

    var arr = new Array();
    for(var i in obj) arr[i] = obj[i];
    

    【讨论】:

      【解决方案4】:

      {} 是一个对象,它包含一个名为notempty 的属性。如果你想要一个数组,它必须是

      [{"notempty":true}]
      

      这是一个在索引 0 处具有单个元素的数组,它是一个具有单个属性 'notempty' 的对象;。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-06-24
        • 2013-03-12
        • 1970-01-01
        • 2017-07-13
        • 1970-01-01
        • 2019-06-17
        • 1970-01-01
        • 2019-07-12
        相关资源
        最近更新 更多