如何在jQuery中解析JSON数组?

编辑我检查了jQuery文档,并使用$ .ajax指定的json数据类型返回一个评估的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 = ''; var 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('
'+message['poster']+'
'+message['time']+''+message['message']+'
'); } }); } });

如果没有$ .each函数,我可以成功解析单个JSON对象,但不能解析数组。 这是我第一次使用JSON和$ .each,我对jQuery很新,所以如果我的代码有丑陋的话,那么就去吧!

不,如果eval不安全,您可以使用更安全的JSON解析器: var myObject = JSON.parse(data); 为此使用lib https://github.com/douglascrockford/JSON-js

我知道你的post发布后很长一段时间了,但我想发帖给其他可能遇到过这个问题的人,并且像我一样偶然发现这篇文章。

似乎有一些关于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 

所以我不知道潜在的问题,一个基本的,老式的javascript for循环似乎是jquery的$.each的function替代

jQuery.parseJSON – jQuery 1.4.1中的新增function

使用.NET 3.5 FIX

你们所有人都有些不对劲,但你们所有努力的结合都得到了回报!

而不是eval(’([‘+ jsonData +’])’); 做

 success: function(msg){ var data = eval(msg.d); var i=0; for(i=0;i 

我对整个“不使用eval”一无所知,但我所知道的是通过做'(['+ msg +'])'你将这些对象嵌套得更深,而不是达到一个水平。

我正在尝试解析从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

关注eval,JSON规范http://json.org/js.html推荐类似的东西

 var myObject = eval('(' + myJSONtext + ')'); 

而且可能还有一些问题。 有一个jQuery插件可以处理它,我想:

http://code.google.com/p/jquery-json/

您可以使用Javascript eval()函数为您解析JSON。 有关更好的解释,请参阅JSON网站 ,但您应该能够将成功function更改为…

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

......或接近的东西。

您可以从JSON.org网站上的链接下载JSON解析器,该链接非常有用 ,您也可以将JSON字符串化以查看内容。

此外,如果您使用EVAL并且它是JSON数组,那么您将需要使用以下synrax:

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

您的data在该时间点是一串'[{}]' ,您可以像这样eval它:

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

然而,这种方法远非安全,这将是更多的工作,但最好的做法是使用Crockford的JSON解析器解析它: https : //github.com/douglascrockford/JSON-js

另一种方法是$.getJSON ,你需要将dataType设置为json以获得纯jQuery reliant方法。

不要评估。 使用真正的解析器,即来自json.org