如何在jQuery中解析JSON数组?
编辑我检查了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非常陌生,所以如果我的代码有些丑陋,那就轻松一下!
你data
是在那个时间点的'[{}]'
一个字符串,可以eval
它像这样:
function(data) {
data = eval('(' + data + ')')
}
但是这种方法还远远没有安全,这将是更多的工作,但最好的做法是Crockford的JSON解析器解析它:https://github.com/douglascrockford/JSON-js
另一种方法是$.getJSON
,你就需要设置dataType
到JSON用于纯jQuery的依赖方法。
如果php jason_encodes是一个单一级别的数组,那么这是否工作?例如,请参阅生成JSON对象的原始代码。只有在数据库查询不生成结果的情况下,数组才是一维的,否则它是多维的。 – user97410 2009-10-22 15:30:07
哦,我没有看到那部分.. hm – 2009-10-22 15:32:54
好的 - 你应该仍然在评估它,现在它已经是你的代码中的一个字符串了,我相信。 – 2009-10-22 15:33:44
您可以使用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);
}
...或者相近。
我认为这实际上是$ .each应该做的,我认为使用带有json数据类型的$ .ajax意味着响应数据是预先评估的。我会尽力:) – user97410 2009-10-22 15:32:14
小心的EVAL,JSON的规格http://json.org/js.html建议像
var myObject = eval('(' + myJSONtext + ')');
而且可能会有一些更多的陷阱。还有的jQuery插件,将照顾它,我猜:
哇,这个插件看起来不错! – cimnine 2009-10-22 15:38:43
没有与eval
是不是安全的,你可以使用JSON解析器是更安全:var myObject = JSON.parse(data);
对于这种用lib https://github.com/douglascrockford/JSON-js
从JSON页面:'eval函数非常快。但是,它可以编译和执行任何JavaScript程序,所以可能存在安全问题。 – 2009-10-22 15:46:59
谢谢。我纠正了我的文字。 – Cesar 2009-10-22 15:58:52
您可以从link on the JSON.org website下载JSON解析器,这很好用,您还可以将JSON字符串化以查看内容。
另外,如果你使用EVAL,这是一个JSON阵列,那么你就需要使用以下synrax:
eval('([' + jsonData + '])');
难道不是评估许可证。使用真正的解析器,即从json.org所
我知道这是你的帖子后很长,但想后为别人谁可能会遇到这个问题,跨越这个岗位绊倒,因为我没有。
似乎有一些关于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
for for循环。救了我一些打字:) – 2013-01-16 08:50:43
我试图解析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
使用.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,”但我知道的是,通过做“([” +味精+“])”你那些筑巢对象更深,而不是一个水平。
您是否设法找到解决方案?如果是这样,我建议选择一个答案:p – 2009-10-22 23:50:21
我还没有,没有。我编辑但没有进一步的答复。问题要么在于PHP编码JSON对象的方式,要么使用$ .each语法。我控制台。记录了响应数据,然后eval() - 编辑它和控制台记录它,我得到同样的东西,所以eval不是答案。 – user97410 2009-10-23 00:19:39