PHPでJSON形式のデータを返すときに気をつけることを数点。
Contents
コンテンツタイプ
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);
}