5

编辑我检查了 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 = '<?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 还很陌生,所以如果我的代码有丑陋的部分,那就放轻松吧!

4

10 回答 10

13

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

于 2009-10-22T15:45:15.053 回答
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]在数据数组上使用数字键时访问元素。因此,由于使用数字索引有效,我尝试(成功)用$.eachfor 循环替换块:

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

于 2011-12-02T19:31:35.133 回答
4

jQuery.parseJSON - new in jQuery 1.4.1

于 2010-10-30T08:39:39.913 回答
2

使用 .NET 3.5修复

你们都有点小错误,但是你们所有的努力都得到了回报!

而不是 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 + '])' 您将这些对象嵌套得更深,而不是向上嵌套.

于 2012-07-13T20:42:48.863 回答
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(){});

请注意这里的子数组键是items,并假设如果你有xyzthen在地方data.items使用data.xyz

于 2012-06-04T12:05:02.200 回答
1

小心评估,JSON 规范http://json.org/js.html推荐类似

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

而且可能还有更多的陷阱。我猜有一个 jQuery 插件可以处理它:

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

于 2009-10-22T15:31:54.517 回答
0

data'[{}]'那个时间点的字符串,你可以eval这样:

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

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

另一种方法是$.getJSON,您需要将dataTypejson 设置为纯 jQuery 依赖方法。

于 2009-10-22T15:23:02.907 回答
0

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

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

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

于 2009-10-22T15:23:24.827 回答
0

您可以从JSON.org 网站上的链接下载 JSON 解析器,效果很好,您还可以对 JSON 进行字符串化以查看内容。

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

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

于 2009-10-22T15:46:34.123 回答
-1

Do NOT eval. use a real parser, i.e., from json.org

于 2009-11-11T13:54:42.050 回答