我想从PHP脚本返回JSON。

我只是重复结果吗?我必须设置内容类型头吗?


当前回答

根据json_encode的手册,该方法可以返回一个非字符串(false):

成功时返回JSON编码字符串,失败时返回FALSE。

当这种情况发生时,echo json_encode($data)将输出空字符串,这是无效的JSON。

如果json_encode的参数包含一个非UTF-8字符串,则json_encode将失败(并返回false)。

这个错误情况应该在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(["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属性的存在表明了一个错误条件,它应该相应地处理这个错误条件。

在生产模式下,最好只向客户端发送一般的错误状态,并记录更具体的错误消息,以便以后进行调查。

在PHP文档中阅读更多关于处理JSON错误的内容。

其他回答

尝试json_encode对数据进行编码,并设置带有header的content-type (' content-type: application/json');

是的,你需要使用echo来显示输出。Mimetype: application / json

根据json_encode的手册,该方法可以返回一个非字符串(false):

成功时返回JSON编码字符串,失败时返回FALSE。

当这种情况发生时,echo json_encode($data)将输出空字符串,这是无效的JSON。

如果json_encode的参数包含一个非UTF-8字符串,则json_encode将失败(并返回false)。

这个错误情况应该在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(["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属性的存在表明了一个错误条件,它应该相应地处理这个错误条件。

在生产模式下,最好只向客户端发送一般的错误状态,并记录更具体的错误消息,以便以后进行调查。

在PHP文档中阅读更多关于处理JSON错误的内容。

虽然你通常没有它也没问题,但你可以也应该设置Content-Type头文件:

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

如果我没有使用特定的框架,我通常允许一些请求参数修改输出行为。通常对于快速故障排除,不发送报头或有时print_r数据有效负载来观察它(尽管在大多数情况下,这应该是不必要的)是很有用的。

一个返回带有HTTP状态代码的JSON响应的简单函数。

function json_response($data=null, $httpStatus=200)
{
    header_remove();

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

    http_response_code($httpStatus);

    echo json_encode($data);

    exit();
}