2014-05-30 3 views
0

Я пишу AJAX приложения и имеют функцию в PHP скрипт:json_encode положить пустой массив на конце JSON

public function expire_user() { 
    $r=array("return"=>'OK'); 
    echo json_encode($r); 
} 

, который вызывается с этим JavaScript:

$.getJSON("https://stackoverflow.com/users/expire_user",function(data){ 
     alert('success'); 
}); 

проблема в том, что предупреждение никогда не отображается. Я думаю, что это связанно с json_encode возвращения недопустимого JSON, потому что, когда я иду по прямой ссылке, он отображает

{"return":"OK"}[] 

, который не является допустимым JSON из-за дополнительный «[]» на конце. Почему json_encode помещает пустой массив в конец и как мне избавиться от него, чтобы я мог получить действительный json?

+0

Можем ли мы видеть, как 'expire_user' вызывается из' GET/users/expire_user'? Уверен, что это сработает, если вы сразу же убьете скрипт: 'die (json_encode ($ r));' – Sam

+0

Возможный дубликат [Почему я получаю дополнительный элемент в конце в JSON?] (Http: // stackoverflow. com/questions/7535724/why-do-i-get-an-extra-element-at-the-end-in-json) – JakeGould

+0

не думаю, что это дубликат, потому что комментарий Сэма работал на меня, и это не было в другой ответ. @Sam отправьте свой код в качестве ответа, и я соглашусь с ним. – Cbas

ответ

2

Wild догадка, но, возможно, вы должны установить правильные заголовки для JSON в функции PHP, как это:

public function expire_user() { 
    $r=array("return"=>'OK'); 
    header("Content-type: application/json"); 
    echo json_encode($r); 
} 

Или на самом деле отправить содержание, как X-JSON заголовки, как это:

public function expire_user() { 
    $r=array("return"=>'OK'); 
    $json_data = json_encode($r); 
    header('X-JSON: (' . $json_data . ')'); 
    header('Content-type: application/x-json'); 
    echo $json_data; 
} 

A бит, ржавый, при использовании X-JSON сопроводительный заголовок должен быть application/x-json или просто нормальным application/json, но добавив это предостережение, чтобы помочь вам отладить.

+0

ни один из этих изменений не изменил результат. По-прежнему остается пустой массив при возврате – Cbas

+0

. Проверьте этот поток. Может быть проблема с браузером.JSON непоследовательно обрабатывается в некоторых браузерах. http://stackoverflow.com/questions/7535724/why-do-i-get-an-extra-element-at-the-end-in-json – JakeGould

+1

Я не знал о заголовках, хотя это было очень полезно – Cbas

1

Это не совсем «ответ», но я предполагаю, что ваш скрипт запускает какой-то другой код (возможно, echo json_encode(array());) через некоторое время после вызова expire_user(). Для того, чтобы убедиться, что это последняя вещь, называемая вы можете использовать die() или exit():

public function expire_user() { 
    $r = array("return"=>'OK'); 
    die(json_encode($r)); 
} 

Однако, я предлагаю вам попробовать отладить реальную проблему. Например, если у вас есть URL-маршрутизатор, чем обрабатывает запросы и методы вызова ... он может ошибочно вторгаться в дополнительные символы (что может вызвать больше проблем в строке). Если вы разместите свой код, который вызывает expire_user(), я могу помочь отладить его дальше.


Отказ от ответственности: Я не считают это производство достойным решением. Однако для этого требуется большая отладка.

+2

Справа снова .. expire_users на самом деле намного более длинная функция, и я думал, что это были только две строки, отправляющие вывод, но затем я нашел эхо с пустым массивом где-то внизу, когда я снова проверил – Cbas

+1

Рад, что вы смогли получить на дне, я бы не стал полагаться на 'die()' then. Оказалось, что было очень полезно при отладке проблемы ('var_dump();' и 'exit;' являются моими друзьями). – Sam

+0

@Cbas "... но затем я обнаружил эхо с пустым массивом где-то внизу, когда я снова проверил". Это отличный ответ не из-за того, что это производство достойное или нет, но объясняет практику отладки, которая действительно полезна. +1 от меня. – JakeGould

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