Javascript 在Ajax中获取json数组

Javascript 在Ajax中获取json数组,javascript,jquery,ajax,json,Javascript,Jquery,Ajax,Json,我试图显示来自ajax响应的一些数据,如下所示 $.post( '/tests/elementary/'+($(this).attr('data-test-id'))+'/get-details', // location of your php script { }, // any data you want to send to the script function( data ) { //

我试图显示来自ajax响应的一些数据,如下所示

$.post(
            '/tests/elementary/'+($(this).attr('data-test-id'))+'/get-details', // location of your php script
            {
            }, // any data you want to send to the script
            function( data ) {  // a function to deal with the returned information
                if(data.taken =='false'){
                    alert('ok')
                }
                else {

                    $('#test_name').empty().append(data.information);
                    $('#test_point').empty().append(data.details['score']);
                    $('#test_date').empty().append(data.updated_at);


                    for(var i=0;i<data.testlog.length;i++) {
                        var temp = data.testlog[i];
                        $("#test_details_body").append("<tr> <td>"+ (i+1) +"</td> <td>"+temp['operand1']+' '+temp['operator']+' '+temp['operand2']+"</td><td>"+temp['user_answer']+"<td>"+temp['correct'] +"</td><tr>")
                    }



                }
            });
        });

用于获取数据的php脚本

public function getTestDetails($id){

        $exists = Testresult::where('user_id', Auth::id())->where('test_id', $id)->first();

        if($exists==null){
            return Response::json(["success"=>"true", "taken"=>"false"]);
        }
        else{

            $updated_at = date("d-M-Y H:m:s", strtotime($exists->updated_at));
            $testLog = Testlog::where('token', $exists->token)->get();

            $info = Test::where('id', $id)->pluck('name');
            return Response::json(["success"=>"true", "taken"=>"true",
                                    "details"=>"$exists",
                                    "information"=>$info,
                                    "updated_at"=>$updated_at,
                                    "testlog"=>$testLog]);
        }


    }

我做得对吗?

它看起来不像数据。测试日志需要解析,你可以这样做

var testlog = data.testlog
for(var i = 0; i < testlog.length; i++){
    var temp = testlog[i]
    $('#test_details_body').append('<tr><td>' + (i+1) + '</td><td>' + temp.operand1 + ' ' + temp.operator + ' ' + temp.operand2 + '</td><td>' + temp.user_answer + '<td>' + temp.correct + '</td><tr>')
}
var testlog=data.testlog
对于(var i=0;i

此外,我还更改了代码中的一些内容(空格、使用单引号而不是双引号,以及对对象的调用值使用点表示法)。

您的思路正确!我认为这里有两个问题。首先,您正试图将JavaScript对象解析为JavaScript对象。这是可见的,因为屏幕截图显示了通过AJAX调用正确解析大部分对象的响应。您在控制台日志中看到的错误证实了这一点

因此,如下所示删除
JSON.parse(…)
将解决该问题:

for(var i=0;i<data.testlog.length;i++) {
   var temp = data.testlog[i];
   $("#test_details_body").append("<tr> <td>"+ (i+1) +"</td> <td>"+temp['operand1']+' '+temp['operator']+' '+temp['operand2']+"</td><td>"+temp['user_answer']+"<td>"+temp['correct'] +"</td><tr>")
}

对于(var i=0;i“$exists”,
实际上应该是
“details”=>$exists

错误与哪一行代码有关?如果
数据
是一个JavaScript对象,那么你不需要
JSON.parse(…)
如果数据是一个JSON字符串,在循环之前你应该解析它,类似于
数据=JSON.parse(data)
并从循环中删除该解析。一种“最短形式的代码”将包括一个
数据
/
数据的示例。testlog
@ArtyMcFly:实际上,数据有几种类型的响应。一个字符串、一个json和另一个json数组。可能是因为您仍在使用
json.parse
?如果您的代码已更改,请编辑您的问题。同样,在PHP中,请使用真正的布尔值(
true
false
),而不是字符串(
“true”
“false”
)。在JavaScript中执行相同的操作,即
如果(!data.take)
@user1012181它看起来不像是字符串化了的测试日志,所以您不需要对它进行解析。这可能是错误的原因。我更新了我的示例。再见
数据
。我会使用另一个变量+1,PHP修复程序也会修复OP的一些其他JavaScript代码。假设
响应::json
设置了适当的头,jQuery将自动将响应正文解析为JSON。OP不应该使用
JSON.parse
,谢谢您的支持,但它没有帮助。相同的错误仍然存在。PHP错误是一个错误。意外使用了引号。您是否更正了PHP并删除了
JSON.parse(…)
?现在它工作得很好。:)谢谢你的努力。@Phil:你可能还想发布一个答案?我可以投赞成票。@user1012181没有必要。这个答案正确地推断了问题,并提供了正确的答案。没有更多的补充
for(var i=0;i<data.testlog.length;i++) {
   var temp = data.testlog[i];
   $("#test_details_body").append("<tr> <td>"+ (i+1) +"</td> <td>"+temp['operand1']+' '+temp['operator']+' '+temp['operand2']+"</td><td>"+temp['user_answer']+"<td>"+temp['correct'] +"</td><tr>")
}