如何在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非常陌生,所以如果我的代码有些丑陋,那就轻松一下!

+0

您是否设法找到解决方案?如果是这样,我建议选择一个答案:p – 2009-10-22 23:50:21

+0

我还没有,没有。我编辑但没有进一步的答复。问题要么在于PHP编码JSON对象的方式,要么使用$ .each语法。我控制台。记录了响应数据,然后eval() - 编辑它和控制台记录它,我得到同样的东西,所以eval不是答案。 – user97410 2009-10-23 00:19:39

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

您可以使用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

小心的EVAL,JSON的规格http://json.org/js.html建议像

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

而且可能会有一些更多的陷阱。还有的jQuery插件,将照顾它,我猜:

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

+1

哇,这个插件看起来不错! – cimnine 2009-10-22 15:38:43

没有与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

您可以从link on the JSON.org website下载JSON解析器,这很好用,您还可以将JSON字符串化以查看内容。

另外,如果你使用EVAL,这是一个JSON阵列,那么你就需要使用以下synrax:

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

难道不是评估许可证。使用真正的解析器,即从json.org所

jQuery.parseJSON - 新jQuery的1.4.1

我知道这是你的帖子后很长,但想后为别人谁可能会遇到这个问题,跨越这个岗位绊倒,因为我没有。

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

我试图解析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,”但我知道的是,通过做“([” +味精+“])”你那些筑巢对象更深,而不是一个水平。