PHP到JSON数组输出是错误的


PHP to JSON Array Output is Wrong

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

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。

感谢指导!

尝试创建一个results数组并在那里推送每个对象,然后在循环结束后,将数组转换为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);

只是为了在其他答案所建议的代码之外添加更多的解释。问题是,您没有输出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数组。

正如Xorifelse所说,您希望将数据放入数组中,然后在该数组上调用json_encode。下面是一段应该可以工作的代码:

$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);