PHPでJSON形式のデータを返すときに気をつけること

Pocket

PHPでJSON形式のデータを返すときに気をつけることを数点。

コンテンツタイプ

JSONをHTTPで応答するときに指定する、コンテンツタイプは’application/json’である。
header関数で’Content-Type: application/json’を出力する。


header('Content-Type: application/json');
echo json_encode($data);

エンコード

JSONテキストはUnicodeでエンコードするとされている。
UTF-8、UTF-16LE、UTF-16BE、UTF-32LE、UTF-32BEなどの形式があるが、JSONの仕様上デフォルトのエンコードはUTF-8である。
別のエンコードでデータを扱っている場合はUTFに変換する。


header('Content-Type: application/json');
$data = json_encode($data);
$data = mb_convert_encoding($data, "UTF-8", "EUC-JP");
echo $data;

またBOM付エンコードは正しいJSONではないので、ソースファイル自体にBOMが付いているとパース出来なかったりする。

json_encodeの失敗

json_encode関数は成功したときに文字列を、失敗したときにfalseを返す。

上記2つの例のように、json_encodeの返り値をそのままechoするとエラーの場合に空のデータを返すことになる。
(falseをstring型に変換すると長さ0の文字列になるため)

json_encodeが失敗した場合に何を返すかを予め定めておき、そのとおりに処理する。
べつに「json_encodeが失敗したときは長さ0の文字列を返す」という仕様でもよいが
そうすると正しくエンコードされて空文字が返ってきたのか、エラーで空文字が返ってきたのか
わかりにくいので、HTTPステータスコードで500を出すようにすると良いと思う。


header('Content-Type: application/json');
$data = json_encode($data);
if(json_last_error() == JSON_ERROR_NONE){
    echo $data;
}
else{
    http_response_code(500);
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です