[Laravel] JSON response で日本語が文字化けしたので、JSON レスポンス の挙動を調べてみた。

2018年8月12日ITLaravel

Laravel で開発をしていて、JSON レスポンスで日本語が文字化けしたのですが、下記を参考にさせていただき、解消しました。ありがとうございます。

Laravel 5.3 の JSON response において 日本語 が文字化けする問題の解決法

$collection = DB::select('select * from user;');
return response()->json( [
                'data' => $collections
]);

$collection = DB::select('select * from user;');
return response()->json(
[
    'data' => $collections
],
200,[],
JSON_UNESCAPED_UNICODE
);

文字化けが解消したところで、ここでステータスコード 200 や空配列をハードコーディングしている箇所が気になったので、調べました。

return response()->json(['data' => $collections],200,[],JSON_UNESCAPED_UNICODE);

まず response() は Laravel のヘルパ関数で、json メソッドの継承元がこちら

Illuminate/Contracts/Routing/ResponseFactory.php

/**
 * Return a new JSON response from the application.
 *
 * @param  string|array  $data
 * @param  int  $status
 * @param  array  $headers
 * @param  int  $options
 * @return \Illuminate\Http\JsonResponse
 */
public function json($data = [], $status = 200, array $headers = [], $options = 0);

第1引数が「配列」か「文字列」でデータを渡す
第2引数が「ステータスコード」
第3引数が「ヘッダー」
第4引数が「オプション」

本家ドキュメントで述べられてる通り json メソッドが自動で、、、

https://laravel.com/docs/5.6/responses#json-responses

・Content-Type を application/json に設定してくれている
・配列 を json_encode してくれている

ということなので、下記の json メソッドの第1引数は配列で渡してオッケーですし、ヘッダーに application/json と書かなくても良かったんですね。

return response()->json(['data' => $collections],200,[],JSON_UNESCAPED_UNICODE);

第4引数のオプションはPHPのJSON定義済みオプションで、、、

http://php.net/manual/ja/json.constants.php

JSON_UNESCAPED_UNICODE (integer)
マルチバイト Unicode 文字をそのままの形式で扱います (デフォルトでは \uXXXX にエスケープします)。 PHP 5.4.0 以降で使用可能です。

これでマルチバイト文字である日本語を文字コードに変換せずに日本語のまま返してくれる、と。

ちなみに、ファサードでもレスポンスがあるので、use したら、、

use Illuminate\Support\Facades\Response;

下記のようにも書けますね。

return Response::json(
['data' => $data],
200,
[
    'Content-Type' => 'application/json',
],
JSON_UNESCAPED_UNICODE);

ひとこと

コピペで問題解決したからといって、挙動を確認しとかないと後々ハマったら嫌なので、時間がある限り調べていこうと思います。あと、ファサードとヘルパ関数で同じ機能があったら、どちらを採用するほうがいいんでしょうね。

スポンサーリンク

Posted by nobuhiro harada