- 配列をJSONにする
json_encode()は、そのまま使うと日本語が\uXXXXに変換される JSON_UNESCAPED_UNICODEを指定すれば、日本語がそのまま読める綺麗なJSONになる- JSONを配列に戻す
json_decode()は、第2引数にtrueを渡して連想配列として受け取る
1. 今日のお題とゴール
商品データの連想配列をAPI通信や保存用のJSON文字列に変換し、それを再びPHPの連想配列に戻して値を表示する処理を書いてみましょう。
- 連想配列
$itemを、日本語がそのまま読めるJSON文字列に変換して出力する - そのJSON文字列を「連想配列」としてデコード(復元)する
- 復元した配列から商品名と価格を取り出して表示する
// 期待する出力例
JSON出力: {"id":101,"name":"特製ブレンド珈琲","price":580}
復元データ: 特製ブレンド珈琲(580円)
2. ❌ やりがちなNGコード vs ⭕ コピペで動く正解コード
<?php
$item = ['id' => 101, 'name' => '特製ブレンド珈琲', 'price' => 580];
$json = json_encode($item);
echo $json; // {"id":101,"name":"\u7279\u88fd..."} と日本語が読めなくなる
$decoded = json_decode($json);
echo $decoded['name']; // Fatal error: Cannot use object of type stdClass as array
オプションなしの json_encode() は日本語が \u7279... に変換され、中身が読めなくなります。また、json_decode() の第2引数を省略するとオブジェクト(stdClass)が返るため、$decoded['name'] でエラーになります。
<?php
declare(strict_types=1);
$item = [
'id' => 101,
'name' => '特製ブレンド珈琲',
'price' => 580,
];
// 1. 連想配列 → JSON文字列(日本語をそのまま残す)
$json = json_encode($item, JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);
echo 'JSON出力: ' . $json . PHP_EOL;
// 2. JSON文字列 → 連想配列(第2引数に true を指定)
$decoded = json_decode($json, true, 512, JSON_THROW_ON_ERROR);
// 3. 連想配列として安全に値を取得
$name = $decoded['name'] ?? '名称未設定';
$price = $decoded['price'] ?? 0;
echo "復元データ: {$name}({$price}円)" . PHP_EOL;
3. ここだけ押さえる!3つのポイント
第2引数に JSON_UNESCAPED_UNICODE を渡すと、日本語が \uXXXX に変換されずそのまま出力されます。デバッグ時のログ出力や画面確認がグッと楽になる定番オプションです。
json_decode($json, true) のように第2引数へ true を渡すと、結果が扱いやすい「連想配列」になります。省略するとオブジェクトになり、$decoded['name'] でアクセスできなくなります。
デフォルトでは変換に失敗してもエラーにならず null や false が返ります。JSON_THROW_ON_ERROR を付ければ、失敗時にすぐ例外(JsonException)で知らせてくれます。
4. 1分ミニチャレンジ
🚀 手を動かしてみよう
正解コードの json_encode() の第2引数を JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR に変えて実行してみましょう。
ヒント:JSON_PRETTY_PRINT を追加すると、改行とインデントが付いた人間が読みやすい整形済みJSONが出力されます!