2016-11-14 1 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" 
} 

Правильный выход должен иметь },{ НЕ }{ между каждым объектом.

То, что я в конечном счете, пытаюсь сделать:

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

вывод: [{«время»: «2016-11-14 17:42:59», «сигнал»: «Купить», «символ»: «GBPJPYecn», «цена»: «134.88200», «таймфрейм»: «M1», «epoch»: «1479145379»}] [{«время»: «2016-11-14 17:42:41», «сигнал»: «Продать», «символ»: «USOilecn», «цена ":" 43.09000 "," timeframe ":" M1 "," epoch ":" 1479145361 "}] – user3259138

+0

Если я попытаюсь проверить на http: // jsonlint.com /, он говорит недействительно – user3259138

+0

Вы повторно инициализируете '$ a' внутри цикла. Кроме того, нет причин использовать 'array_push'. Его [документация] (http://php.net/manual/en/function.array-push.php) рекомендует не использовать его, когда '[]' append будет работать. –

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, в котором вы нуждаетесь.

Смежные вопросы