2011-08-17 108 views
4

我有一个PHP数组,并用json编码将它回显到javascript,我需要这样做,因为它会非常动态。这是它的回波的代码:解析一个JSON字符串到数组,而不是对象

{"notempty":true} 

我用这个来,将其转换为JavaScript:

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

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

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

由于

+0

在JS枚举数组(或什么是PHP中的枚举数组)行为就像对象 – Mchl

+0

原因是你不能在JavaScript中有关联数组。对象是最接近的匹配项。 –

+0

请勿使用eval。使用JSON的解析方法,如jQuery的http://api.jquery.com/jQuery.parseJSON或使用Douglas Crockford的parseJSON方法。见https://github.com/douglascrockford/JSON-js(下载json2.js) – nickytonline

回答

4

你试图把一个ObjectArray,和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]); 
+1

不要忘记使用[hasOwnProperty](https://developer.mozilla。org/en/JavaScript/Reference/Global_Objects/Object/hasOwnProperty):if(myObj.hasOwnProperty(it)){do something}' –

+0

非常感谢,告诉我通过一个对象循环的方式完全解决了我的问题。 – Chris

1

{}是一个对象,它包含一个名为notempty一个属性。如果你想要的阵列,它不得不是

[{"notempty":true}] 

这与在索引0处,这与单个属性一个“NotEmpty”对象的单个元件的阵列;.

1

默认情况下,如果您在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]; 
0

您可以使用jQuery解析它变成一个这样的数组:

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

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