2016-11-14 65 views
1

我試圖做的並不困難,但由於某種原因,我似乎無法找到正確的方法來輸出這個JSON數組,從PHP。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頁面上的跨度。

欣賞指導!

+0

首先在PHP中,將所需的數據放入一個數組中,然後作爲最終消息使用'json_encode()'回顯數組,以便JS可以讀取輸出。 – Xorifelse

+0

1st:JSON不是數組。 2.這是一個有效的JSON 3:JSON的例子:'{「a」:「b」,「c」:{「d」:「e」}}' –

回答

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); 
+0

這個修正了它。特別是讓json_encode在循環之外。 – user3259138

0

正如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); 
+0

輸出:[{「time」:「2016-11-14 17:42:59」,「signal」:「買入」,「符號」:「GBPJPYecn」,「價格」:「134.88200」,「時間範圍」: 「M1」,「epoch」:「1479145379」}] [{「time」:「2016-11-14 17:42:41」,「signal」:「Sell」,「symbol」:「USOilecn」,「price 「:」43.09000「,」timeframe「:」M1「,」epoch「:」1479145361「}] – user3259138

+0

如果我嘗試驗證http:// jsonlint。com /,它表示無效 – user3259138

+0

您正在循環內重新初始化$ a。另外,沒有理由使用'array_push'。它的[documentation](http://php.net/manual/en/function.array-push.php)建議不要在'[]'追加時使用它。 –

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數組。