PHP到JSON数组输出错误

时间:2016-11-14 17:32:46

标签: javascript php jquery arrays json

我想要做的事并不困难,但出于某种原因,我似乎找不到从PHP输出这个JSON数组的正确方法。

PHP代码:

$a = array();
$i=0;
while($row = mysqli_fetch_array($result))
{
    $i++;
    $a = array();
    $epoch = $row['time']; 
    $dt = new DateTime("@$epoch");  // convert UNIX timestamp to PHP DateTime
    $a = array(
        "time" => $dt->format('Y-m-d H:i:s'),
        "signal" => $row['signal'],
        "symbol" => $row['symbol'],
        "price" => $row['price'],
        "timeframe" => $row['timeframe'],
        "epoch" => $row['time']);

    echo json_encode($a, JSON_UNESCAPED_SLASHES);
}

输出:

{
    "time":"2016-11-14   17:23:00",
    "signal":"Sell",
    "symbol":"XAUUSDecn",
    "price":"1221.64000",
    "timeframe":"M1",
    "epoch":"1479144180"
}
{
    "time":"2016-11-14 17:07:59",
    "signal":"Sell",
    "symbol":"GBPJPYecn",
    "price":"135.13200",
    "timeframe":"M1",
    "epoch":"1479143279"
}

正确的输出应该在每个对象之间有},{ NOT }{

我最终要做的是:

function getTrades(a) {
    $.ajax({    //create an ajax request to load_page.php
        type: "GET",
        url: "core/engine.php",   
        data: "q=data&account="+a,          
        dataType: "html",   //expect html to be returned                
        success: function(response){                    
            if(response=="nologin") {
                alert("Sorry, but either your account is not activated or your login is incorrect!");
            } else {
                var j = $.parseJSON(response);
                $.each(j, function (k, v) {
                    $("#trades").html('<span class="tradesignal"><!-- span class="signalarrowup"></span-->'+v.time+'<span style="color:#2DC14E;"> '+v.signal+'</span> &ensp; <button class="tsym" id="sym_'+v.epoch+'">'+v.symbol+'</button>&ensp; '+v.price+'&ensp; '+v.timeframe+'</span>'); 

                });
            }   
            //alert(response);
            console.log(response);
        }

    });
}

每个{json},{json}对象都会将其数据打印到html页面上的span中。

感谢指导!

3 个答案:

答案 0 :(得分:3)

尝试创建结果数组并将每个对象推送到那里,然后在循环结束后,将数组转换为json并打印它。 例如:

$results = array();
$i = 0;
while($row = mysqli_fetch_array($result)){
    //your code here
    $a =  array("time" => ....);

    $results[] = $a; //this will add $a to $results
}
echo json_encode($results, JSON_UNESCAPED_SLASHES);

答案 1 :(得分:1)

除了代码之外,还要添加一些其他答案建议的解释。问题是,你没有输出JSON数组。每次你做

echo json_encode($a, JSON_UNESCAPED_SLASHES);
在循环中输出一个有效的JSON对象,如:

{
    "time":"2016-11-14   17:23:00",
    "signal":"Sell",
    "symbol":"XAUUSDecn",
    "price":"1221.64000",
    "timeframe":"M1",
    "epoch":"1479144180"
}

但是,当您输出后续对象时,会得到像

这样的结果
{
    "time": ...
}
{
    "time": ...
}

您不再拥有有效的JSON。尽管每个单独的对象都是有效的,但将它们连接在一起并不是一件容易的事。只是在对象之间添加逗号仍然无法使其有效。为了生成一个实际的JSON数组,逗号分隔的对象需要用方括号括起来,如下所示:

[
  {
    "time": ...
  },
  {
    "time": ...
  }
]

这就是为什么你需要将你在循环中创建的每个数组添加到外部数组然后在循环之后json_encode整个事物。外部PHP数组将成为您需要的外部JSON数组。

答案 2 :(得分:0)

正如Xorifelse所说,你想把数据放在一个数组中,然后在数组上调用$a = array(); $i=0; while($row = mysqli_fetch_array($result)) { $i++; $epoch = $row['time']; $dt = new DateTime("@$epoch"); // convert UNIX timestamp to PHP Date $a[] = array("time" => $dt->format('Y-m-d H:i:s'), "signal" => $row['signal'], "symbol" => $row['symbol'], "price" => $row['price'], "timeframe" => $row['timeframe'],"epoch" => $row['time']); } echo json_encode($a, JSON_UNESCAPED_SLASHES); 。这是一个应该有效的代码:

{{1}}