PHPスクリプトからJSONを返す

2010年11月01日に質問されました。  ·  閲覧回数 1.1M回  ·  ソース

Scott Nicol picture
2010年11月01日

PHPスクリプトからJSONを返したい。

結果をエコーするだけですか? Content-Typeヘッダーを設定する必要がありますか?

回答

timdev picture
2010年11月01日
1696

通常はそれがなくても問題ありませんが、 Content-Typeヘッダーを設定できます。

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

特定のフレームワークを使用していない場合、通常、いくつかのリクエストパラメータで出力動作を変更することを許可します。 一般に、迅速なトラブルシューティングのために、ヘッダーを送信しないこと、またはデータペイロードをprint_rして目で確認することが役立つ場合があります(ほとんどの場合、必要ないはずです)。

aesede picture
2014年07月31日
129

JSONを返す素晴らしく明確なPHPコードの完全な部分は次のとおりです。

$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 );
trincot picture
2016年02月14日
48

json_encodefalse )を返す可能性があります。

成功した場合はJSONでエンコードされた文字列を返し、失敗した場合はFALSEを返します。

これが発生すると、 echo json_encode($data)は空の文字列を出力します。これは

json_encodeは、引数にUTF-8以外の文字列が含まれている場合、たとえば失敗します(そして、 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プロパティの存在がエラー状態を示していることを認識している必要があり、それに応じて処理する必要があります。

本番モードでは、一般的なエラーステータスのみをクライアントに送信し、後で調査するために、より具体的なエラーメッセージをログに記録する方がよい場合があります。

JSONエラーの処理について詳しくは、 PHPのドキュメントをご覧ください。

thejh picture
2010年11月01日
39

json_encodeを試してデータをエンコードし、コンテンツタイプをheader('Content-type: application/json');ます。

Dr. Aaron Dishno picture
2017年06月14日
16

アクセスセキュリティを設定するのも良いでしょう-アクセスできるようにしたいドメインに*を置き換えるだけです。

<?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をバイパスする方法は?

Brad Mace picture
2010年11月01日
15

コンテンツタイプをheader('Content-type: application/json');で設定してから、データをエコーし​​ます。

Joyal picture
2019年02月28日
8
<?php
$data = /** whatever you're serializing **/;
header("Content-type: application/json; charset=utf-8");
echo json_encode($data);
?>
Tom Ah picture
2016年12月29日
6

上で述べたように:

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

仕事をします。 ただし、次の点に注意してください。

  • jsonにいくつかのHTMLタグが含まれている場合を除いて、このヘッダーが使用されていなくても、Ajaxはjsonを読み取るのに問題はありません。 この場合、ヘッダーをapplication / jsonとして設定する必要があります。

  • ファイルがUTF8-BOMでエンコードされていないことを確認してください。 この形式では、ファイルの先頭に文字が追加されるため、header()呼び出しは失敗します。

Dan picture
2019年04月08日
6

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();
}
sonique picture
2020年07月10日
6

この質問には多くの回答がありましたが、JSON応答の不正な形式を防ぐために必要なすべてのものを含むクリーンなJSONを返すプロセス全体をカバーするものはありません。


/*
 * returnJsonHttpResponse
 * @param $success: Boolean
 * @param $data: Object or Array
 */
function returnJsonHttpResponse($success, $data)
{
    // remove any string that could create an invalid JSON 
    // such as PHP Notice, Warning, logs...
    ob_clean();

    // this will clean up any previously added headers, to start clean
    header_remove(); 

    // Set the content type to JSON and charset 
    // (charset can be set to something else)
    header("Content-type: application/json; charset=utf-8");

    // Set your HTTP response code, 2xx = SUCCESS, 
    // anything else will be error, refer to HTTP documentation
    if ($success) {
        http_response_code(200);
    } else {
        http_response_code(500);
    }
    
    // encode your PHP Object or Array into a JSON string.
    // stdClass or array
    echo json_encode($data);

    // making sure nothing is added
    exit();
}

参照:

response_remove

ob_clean

コンテンツタイプのJSON

HTTPコード

http_response_code

json_encode