2009-10-22 49 views
5

編輯我檢查了jQuery文檔,並使用$ .ajax與指定的json數據類型返回一個評估的JavaScript對象,所以eval()不是這裏的答案。無論如何,我知道,因爲我能夠解析單個JSON對象,而不是數組。問題是$。每個我的方式通過他們:)如何在jQuery中解析JSON數組?

我已經遵循的語法解析jQuery中的JSON數組到字母,但它不起作用的原因。我使用$ .ajax獲取數組,指定了正確的數據類型,並且在Firebug中可以看到來自我的PHP腳本的響應是[]。然而,當我嘗試使用$ .each遍歷數組時,我試圖對console.log中的各個部分進行嘗試時,所得到的值都是未定義的值。這是我的PHP腳本,使其中和編碼陣列:

if(mysqli_num_rows($new_res) > 0) { 
$messages = array(); 

while($message_data = mysqli_fetch_assoc($query_res)) { 
    $message = array(
    'poster' => $message_data['poster'], 
    'message' => $message_data['message'], 
    'time' => $message_data['time'] 
); 

    $messages[] = $message; 
} 

echo json_encode($messages); 
} else if(mysqli_num_rows($new_res) == 0) { 
$message = array(
    'poster' => '', 
    'message' => 'No messages!', 
    'time' => 1 
); 

echo json_encode($message); 
} 

這裏是我嘗試分析它:

var logged_in = '<?php echo $logged_in; ?>'; 
    var poster = '<?php echo $_SESSION["poster"];?>'; 
    $.ajax({ 
    url: 'do_chat.php5', 
    type: 'post', 
    data: ({'poster':poster,'logged_in':logged_in}), 
    dataType: 'json', 
    success: function(data) { 
     $.each(data, function(messageIndex, message) { 
        console.log(parseInt($('#chatWindow :last-child > span').html())+' '+message['time']); 
     if((parseInt(message['time']) > parseInt($('#chatWindow :last-child > span').html()))) { 
    $('#chatWindow').append('<div class="poster">'+message['poster']+'</div><div class="message"><span>'+message['time']+'</span>'+message['message']+'</div>'); 
     } 
     }); 
    } 
    }); 

沒有$。每個功能我能夠成功地解析單個JSON對象,但不是數組。這是我第一次使用JSON和$ .each進行遊戲,而且我對jQuery非常陌生,所以如果我的代碼有些醜陋,那就輕鬆一下!

+0

您是否設法找到解決方案?如果是這樣,我建議選擇一個答案:p – 2009-10-22 23:50:21

+0

我還沒有,沒有。我編輯但沒有進一步的答覆。問題要麼在於PHP編碼JSON對象的方式,要麼使用$ .each語法。我控制檯。記錄了響應數據,然後eval() - 編輯它和控制檯記錄它,我得到同樣的東西,所以eval不是答案。 – user97410 2009-10-23 00:19:39

回答

0

data是在那個時間點的'[{}]'一個字符串,可以eval它像這樣:

function(data) { 
    data = eval('(' + data + ')') 
} 

但是這種方法還遠遠沒有安全,這將是更多的工作,但最好的做法是Crockford的JSON解析器解析它:https://github.com/douglascrockford/JSON-js

另一種方法是$.getJSON,你就需要設置dataType到JSON用於純jQuery的依賴方法。

+0

如果php jason_encodes是一個單一級別的數組,那麼這是否工作?例如,請參閱生成JSON對象的原始代碼。只有在數據庫查詢不生成結果的情況下,數組纔是一維的,否則它是多維的。 – user97410 2009-10-22 15:30:07

+0

哦,我沒有看到那部分.. hm – 2009-10-22 15:32:54

+0

好的 - 你應該仍然在評估它,現在它已經是你的代碼中的一個字符串了,我相信。 – 2009-10-22 15:33:44

0

您可以使用Javascript eval()函數爲您解析JSON。爲了更好地解釋見the JSON website,但你應該能夠改變你的成功的功能...

var returnedObjects = eval(data); 
var i = 0; 
for (i = 0; i < returnedObjects.length; i++){ 
    console.log('Time: ' + returnedObjects[i].time); 
} 

...或者相近。

+0

我認爲這實際上是$ .each應該做的,我認爲使用帶有json數據類型的$ .ajax意味着響應數據是預先評估的。我會盡力:) – user97410 2009-10-22 15:32:14

13

沒有與eval是不是安全的,你可以使用JSON解析器是更安全:var myObject = JSON.parse(data); 對於這種用lib https://github.com/douglascrockford/JSON-js

+1

從JSON頁面:'eval函數非常快。但是,它可以編譯和執行任何JavaScript程序,所以可能存在安全問題。 – 2009-10-22 15:46:59

+0

謝謝。我糾正了我的文字。 – Cesar 2009-10-22 15:58:52

0

您可以從link on the JSON.org website下載JSON解析器,這很好用,您還可以將JSON字符串化以查看內容。

另外,如果你使用EVAL,這是一個JSON陣列,那麼你就需要使用以下synrax:

eval('([' + jsonData + '])');

-1

難道不是評估許可證。使用真正的解析器,即從json.org所

5

我知道這是你的帖子後很長,但想後爲別人誰可能會遇到這個問題,跨越這個崗位絆倒,因爲我沒有。

似乎有一些關於jquery的$.each改變了數組中元素的性質。

我想執行以下操作:

$.getJSON('/ajax/get_messages.php', function(data) { 

    /* data: 

    [{"title":"Failure","details":"Unsuccessful. Please try again.","type":"error"}, 
    {"title":"Information Message","details":"A basic informational message - Please be aware","type":"info"}] 

    */ 

    console.log ("Data0Title: " + data[0].title); 
    // prints "Data0Title: Failure" 

    console.log ("Data0Type: " + data[0].type); 
    // prints "Data0Type: error" 

    console.log ("Data0Details: " + data[0].details); 
    // prints "Data0Details: Unsuccessful. Please try again" 


    /* Loop through data array and print messages to console */ 

}); 

爲了完成循環,我首先通過數據陣列使用一個jquery $.each循環試過。然而,由於OP筆記,這不工作的權利:

$.each(data, function(nextMsg) {  
    console.log (nextMsg.title + " (" + nextMsg.type + "): " + nextMsg.details); 
    // prints 
    // "undefined (undefined): undefined 
    // "undefined (undefined): undefined 
}); 

這並沒有完全意義的,因爲我能夠使用數據陣列上的數字鍵時訪問data[0]元素。如此以來,使用數字索引工作,我嘗試(成功)以取代$.each塊循環:

var i=0; 
for (i=0;i<data.length;i++){ 
    console.log (data[i].title + " (" + data[i].type + "): " + data[i].details); 
    // prints 
    // "Failure (error): Unsuccessful. Please try again" 
    // "Information Message (info): A basic informational message - Please be aware" 
} 

所以我不知道潛在的問題,for循環基本的,老式的JavaScript似乎是功能性替代jQuery的$.each

+0

for for循環。救了我一些打字:) – 2013-01-16 08:50:43

2

我試圖解析JSON數據從Ajax調用返回,併爲我工作如下:

樣品的PHP代碼

$portfolio_array= Array('desc'=>'This is test description1','item1'=>'1.jpg','item2'=>'2.jpg'); 

echo json_encode($portfolio_array); 

而在.js文件,我解析如下:

var req=$.post("json.php", { id: "" + id + ""}, 
function(data) { 
    data=$.parseJSON(data); 
    alert(data.desc); 
    $.each(data, function(i,item){ 
    alert(item); 
    }); 
}) 
.success(function(){}) 
.error(function(){alert('There was problem loading portfolio details.');}) 
.complete(function(){}); 

如果你有多維數組像下面

$portfolio_array= Array('desc'=>'This is test description 1','items'=> array('item1'=>'1.jpg','item2'=>'2.jpg')); 
echo json_encode($portfolio_array); 

然後下面的代碼應該工作:

var req=$.post("json.php", { id: "" + id + 
    function(data) { 
    data=$.parseJSON(data); 
    alert(data.desc); 
    $.each(data.items, function(i,item){ 
    alert(item); 
    }); 
}) 
.success(function(){}) 
.error(function(){alert('There was problem loading portfolio details.');}) 
.complete(function(){}); 

請注意這裏的子數組鍵是項目,並假設如果你有xyz,那麼代替data.items使用data.xyz

2

使用.NET 3.5 FIX

你們都是稍有不妥,但所有的努力的組合已見成效!

而不是eval('(['+ jsonData +'])');不要

success: function(msg){ 
var data = eval(msg.d); 
var i=0; 
for(i=0;i<data.length;i++){ 
    data[i].parametername /// do whatever you want here. 
}; 

我不知道整個事情「不使用eval,」但我知道的是,通過做「([」 +味精+「])」你那些築巢對象更深,而不是一個水平。