Возвращение JSON из PHP-скрипта - PullRequest
765 голосов
/ 31 октября 2010

Я хочу вернуть JSON из скрипта PHP.

Я просто повторяю результат? Нужно ли устанавливать заголовок Content-Type?

Ответы [ 16 ]

1396 голосов
/ 31 октября 2010

Хотя обычно у вас все нормально, вы можете и должны установить заголовок Content-Type:

<?PHP
$data = /** whatever you're serializing **/;
header('Content-Type: application/json');
echo json_encode($data);

Если я не использую конкретную платформу, я обычно позволяю некоторым параметрам запроса изменять поведение вывода. Это может быть полезно, как правило, для быстрого устранения неполадок, чтобы не отправлять заголовок, или иногда print_r полезную нагрузку данных, чтобы увидеть его (хотя в большинстве случаев это не нужно).

106 голосов
/ 31 июля 2014

Полный фрагмент красивого и понятного PHP-кода, возвращающего JSON:

$option = $_GET['option'];

if ( $option == 1 ) {
    $data = [ 'a', 'b', 'c' ];
    // will encode to JSON array: ["a","b","c"]
    // accessed as example in JavaScript like: result[1] (returns "b")
} else {
    $data = [ 'name' => 'God', 'age' => -1 ];
    // will encode to JSON object: {"name":"God","age":-1}  
    // accessed as example in JavaScript like: result.name or result['name'] (returns "God")
}

header('Content-type: application/json');
echo json_encode( $data );
37 голосов
/ 31 октября 2010

Попробуйте json_encode , чтобы закодировать данные и установить тип содержимого с помощью header('Content-type: application/json');.

36 голосов
/ 14 февраля 2016

В соответствии с руководством на json_encode метод может возвращать нестроковый ( false ):

Возвращает строку в кодировке JSON дляуспех или FALSE при ошибке.

Когда это произойдет, echo json_encode($data) выведет пустую строку, которая недопустима, JSON .

json_encodeнапример, сбой (и возврат false), если его аргумент содержит строку, отличную от UTF-8.

Это условие ошибки должно быть зафиксировано в PHP, например, так:

<?php
header("Content-Type: application/json");

// Collect what you need in the $data variable.

$json = json_encode($data);
if ($json === false) {
    // Avoid echo of empty string (which is invalid JSON), and
    // JSONify the error message instead:
    $json = json_encode(array("jsonError", json_last_error_msg()));
    if ($json === false) {
        // This should not happen, but we go all the way now:
        $json = '{"jsonError": "unknown"}';
    }
    // Set HTTP response status code to: 500 - Internal Server Error
    http_response_code(500);
}
echo $json;
?>

Тогда принимающая сторона, конечно, должна знать, что наличие jsonError свойство указывает на состояние ошибки, которое оно должно соответственно обработать.

В рабочем режиме может быть лучше отправить клиенту только общее состояние ошибки и записать более конкретные сообщения об ошибках для дальнейшего изучения.

Подробнее о работе с ошибками JSON см. В * 1031.* Документация PHP .

15 голосов
/ 31 октября 2010

Установите тип контента с помощью header('Content-type: application/json');, а затем отобразите ваши данные.

11 голосов
/ 14 июня 2017

Также неплохо установить безопасность доступа - просто замените * доменом, к которому вы хотите иметь доступ.

<?php
header('Access-Control-Allow-Origin: *');
header('Content-type: application/json');
    $response = array();
    $response[0] = array(
        'id' => '1',
        'value1'=> 'value1',
        'value2'=> 'value2'
    );

echo json_encode($response); 
?>

Вот еще примеры: как обойти Access-Control-Allow-Origin?

4 голосов
/ 28 февраля 2019
<?php
$data = /** whatever you're serializing **/;
header("Content-type: application/json; charset=utf-8");
echo json_encode($data);
?>
3 голосов
/ 28 декабря 2016

Как сказано выше:

header('Content-Type: application/json');

сделает работу. но имейте в виду, что:

  • У Ajax не будет проблем с чтением json, даже если этот заголовок не используется, за исключением случаев, когда ваш json содержит некоторые HTML-теги. В этом случае вам нужно установить заголовок как application / json.

  • Убедитесь, что ваш файл не закодирован в UTF8-BOM. В этом формате добавляется символ в верхней части файла, поэтому ваш вызов header () не будет выполнен.

3 голосов
/ 31 октября 2010

Ответ на ваш вопрос здесь ,

В нем говорится.

MIME-тип носителя для текста JSON - application / json.

, так что если вы установите заголовок для этого типа и выведите строку JSON, он должен работать.

1 голос
/ 12 сентября 2017

Это простой PHP-скрипт, который возвращает мужской женский и идентификатор пользователя, так как значение json будет любым случайным значением при вызове скрипта json.php.

Надеюсь, эта помощь благодаря

<?php
header("Content-type: application/json");
$myObj=new \stdClass();
$myObj->user_id = rand(0, 10);
$myObj->male = rand(0, 5);
$myObj->female = rand(0, 5);
$myJSON = json_encode($myObj);
echo $myJSON;
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...