2011-08-17 105 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,而不是一個數組或任何其他字符串,當然。