编辑我检查了jQuery文档,并使用指定了json数据类型的$ .ajax返回一个已评估的javascript对象,因此eval()不是这里的答案。无论如何,我知道,因为我能够解析单个JSON对象,而不是数组。问题是$ .each-ing通过他们的方式:)
我已经遵循了将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>');
}
});
}
});
如果没有$ .each函数,我可以成功解析单个JSON对象,但不能解析数组。这是我第一次使用JSON和$ .each,我对jQuery很新,所以如果我的代码有丑陋的话,那就好了!
答案 0 :(得分:13)
不,如果eval
不安全,您可以使用更安全的JSON解析器:var myObject = JSON.parse(data);
为此,请使用lib https://github.com/douglascrockford/JSON-js
答案 1 :(得分: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]
元素,因此这没有用。因此,由于使用了数字索引,我尝试(成功)用for循环替换$.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"
}
所以我不知道潜在的问题,一个基本的,老式的javascript for循环似乎是jquery的$.each
答案 2 :(得分:4)
jQuery.parseJSON - jQuery 1.4.1中的新内容
答案 3 :(得分:2)
我正在尝试解析从ajax调用返回的JSON数据,以下内容对我有用:
示例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
答案 4 :(得分: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”一无所知,但我所知道的是,通过执行'(['+ msg +'])'你将这些对象嵌套得更深,而不是升级。
答案 5 :(得分:1)
小心使用eval,JSON规范http://json.org/js.html推荐类似
的内容var myObject = eval('(' + myJSONtext + ')');
可能还有一些问题。有一个jQuery插件可以处理它,我想:
答案 6 :(得分:0)
您的data
在该时间点是一个'[{}]'
字符串,您可以eval
这样:
function(data) {
data = eval( '(' + data + ')' )
}
然而,这种方法远非安全,这将是一项更多工作,但最佳做法是使用Crockford的JSON解析器解析它:https://github.com/douglascrockford/JSON-js
另一种方法是$.getJSON
,您需要将dataType
设置为json以获得纯jQuery依赖方法。
答案 7 :(得分: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);
}
......或接近的东西。
答案 8 :(得分:0)
您可以从link on the JSON.org website下载JSON解析器,该解析器效果很好,您也可以将JSON字符串化以查看内容。
此外,如果您使用EVAL并且它是JSON数组,那么您将需要使用以下synrax:
eval('([' + jsonData + '])');
答案 9 :(得分:-1)
不要评估。使用真正的解析器,即来自json.org