2009-10-28 208 views
4

我遇到了jQuery/Ajax/JSON的問題。我使用jQuery的阿賈克斯後,像這樣......通過JavaScript遍歷/解析JSON對象

$.ajax({ 
    type: "POST", 
    dataType: "json", 
    url: "someurl.com", 
    data: "cmd="+escape(me.cmd)+"&q="+q+"&"+me.args, 
    success: function(objJSON){ 
    blah blah... 
    } 
}); 

這是我的理解是,這將返回一個JavaScript JSON對象?該阿賈克斯後產生的文字是這樣的(我相信這是有效的JSON)......

{ 
    "student":{ 
    "id": 456, 
    "full_name": "GOOBER, ANGELA", 
    "user_id": "2733245678", 
    "stin": "2733212346" 
    }, 
    "student":{ 
    "id": 123, 
    "full_name": "BOB, STEVE", 
    "user_id": "abc213", 
    "stin": "9040923411" 
    } 
} 

我似乎無法弄清楚如何通過jQuery的阿賈克斯後返回的JSON對象解析.. 。基本上我想通過循環,使一個div出每個學生的返回是這樣的...

$("<div id=\"" + student.id + "\">" + student.full_name + " (" + student.user_id + " - " + student.stin + ")</div>") 

我似乎無法弄清楚如何做到這一點?

請幫助! 謝謝!

+0

燦JSON具有相同的密鑰(這裏的 「學生」)我一個對象多次?如果沒有,那麼你得到的不是JSON。 – 2009-10-28 13:49:00

+1

不,它不能.... – jlarson 2009-10-28 13:49:54

回答

26

你的JSON對象不正確,因爲它有具有相同名稱的多個屬性。您應該返回一組「學生」對象。

[ 
    { 
    "id": 456, 
    "full_name": "GOOBER ANGELA", 
    "user_id": "2733245678", 
    "stin": "2733212346" 
    }, 
    { 
    "id": 123, 
    "full_name": "BOB, STEVE", 
    "user_id": "abc213", 
    "stin": "9040923411" 
    } 
] 

然後你可以迭代它像這樣:

for (var i = 0, len = objJSON.length; i < len; ++i) { 
    var student = objJSON[i]; 
    $("<div id=\"" + student.id + "\">" + student.full_name + " (" + student.user_id + " - " + student.stin + ")</div>")... 
} 
+1

感謝您的答案,它的工作原理!然而,只是一個問題......我怎麼不能爲(學生在objJSON){}?我試過了,它不工作......好吧,無論如何,它的工作原理。再次感謝。 – Ryan 2009-10-28 14:32:08

+0

我會認爲它會工作,但我更喜歡迭代使用索引的數組。 – tvanfosson 2009-10-28 14:42:38

+0

http://stackoverflow.com/questions/2498107/iterating-through-json-object-doesnt-seem-to-work-for-me ... – 2010-03-23 07:01:13

3

您目前使用的JSON將無法工作,因爲第二個「學生」有效地替換了第一個,因爲這些只是對象中的屬性。

如果你能控制的JSON輸出,將其更改爲:

{ 
    "student":[{ 
    "id": 456, 
    "full_name": "GOOBER, ANGELA", 
    "user_id": "2733245678", 
    "stin": "2733212346" 
    },{ 
    "id": 123, 
    "full_name": "BOB, STEVE", 
    "user_id": "abc213", 
    "stin": "9040923411" 
    }] 
} 

然後你有一個數組,你可以遍歷:

for(var i=0; i<objJSON.student.length; i++) { 
    ...objJSON.student[i]... 
    } 
4

有與JSON的問題 - 外花括號應該是方括號,因爲你想有一個列表,而不是一個地圖(又名目的)。由於地圖中的所有對象都具有相同的密鑰,因此它不會正確解析 - 最後一個值將覆蓋大多數解析器下的前一個值。

你想:

[ 
    { 
    "id": 456, 
    "full_name": "GOOBER, ANGELA", 
    "user_id": "2733245678", 
    "stin": "2733212346" 
    }, 
    { 
    "id": 123, 
    "full_name": "BOB, STEVE", 
    "user_id": "abc213", 
    "stin": "9040923411" 
    } 
] 

或可替代的地圖用不同的密鑰:

{ 
    "456":{ 
    "id": 456, 
    "full_name": "GOOBER, ANGELA", 
    "user_id": "2733245678", 
    "stin": "2733212346" 
    }, 
    "123":{ 
    "id": 123, 
    "full_name": "BOB, STEVE", 
    "user_id": "abc213", 
    "stin": "9040923411" 
    } 
} 

你會更好使用$ .getJSON,這是$阿賈克斯的專用版本這個目的。

$.getJSON("someurl.com", function(students) { 
    $.each(students, function() { 
    $("<div id=\"" + student.id + "\">" + student.full_name + " (" + student.user_id + " - " + student.stin + ")</div>").appendTo($container); 
    }); 
}); 
+0

您的第一個建議存在錯誤:您仍然擁有陣列中的條目的屬性名稱(「學生」)。修復時會刪除downvote。 – 2009-10-28 14:26:20

+0

已修復,謝謝。 – mahemoff 2009-10-29 14:55:21

0
var data = '[ 
    { 
     "id": 456, 
     "full_name": "GOOBER, ANGELA", 
     "user_id": "2733245678", 
     "stin": "2733212346" 
    }, 
    { 
     "id": 123, 
     "full_name": "BOB, STEVE", 
     "user_id": "abc213", 
     "stin": "9040923411" 
    } 
]'; 

$.each(data, function(index, val) { 
    alert(val.id); 
    alert(val.full_name); 
    alert(val.user_id); 
    alert(val.stin);  
})