将JSON字符串解析为数组而不是对象

5
我有一个PHP数组,用json编码将其输出到javascript中。我需要这样做是因为它将会是非常动态的。下面是输出的代码:
{"notempty":true}

我使用这个方法,将其转换为JavaScript:

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

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

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

谢谢


在JS中,枚举数组(或在PHP中的枚举数组)的行为类似于对象。 - Mchl
原因是在JavaScript中无法使用关联数组,对象是最接近的匹配。 - Álvaro González
不要使用 eval。使用 JSON 解析方法,例如 jQuery 的 http://api.jquery.com/jQuery.parseJSON 或使用 Douglas Crockford 的 parseJSON 方法。请参阅 https://github.com/douglascrockford/JSON-js(下载 json2.js)。 - nickytonline
4个回答

5
您正在尝试将一个 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] );

3
在遍历对象属性时,请不要忘记使用 hasOwnProperty 方法:for (var it in myObj) if(myObj.hasOwnProperty(it)) {do something}。请注意不要改变原文的含义。 - Dan Manastireanu
非常感谢您告诉我如何循环遍历一个对象,这完全解决了我的问题。 - Chris

1

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

[{"notempty":true}]

这是一个数组,它在索引0处只有一个元素,该元素是一个对象,具有单个属性“notempty”。


1

默认情况下,如果您在php中对关联数组进行编码,解码后它将变成一个js对象。为了使其成为一个数组,您需要在php中将其转换为数组:

PHP:

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

否则,您应该在JS中将其转换为数组,但我认为这是一种浪费,因为在javascript中循环遍历对象要容易得多:
Javascript:
var arr = new Array();
for(var i in obj) arr[i] = obj[i];

0

您可以使用jQuery将其解析为数组,如下所示:

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

我假设你想解析JSON,而不是数组或其他字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接