# JSONとPHP

## JSONのファイル形式について

JSONとは、テキストファイルの中にデータを保存し、整理するための方法である。ウェブアプリケーションでよく使われていて、クライアントとサーバーの間でデータをやりとりするときによく使われる。

JSONファイルの中では、辞書（連想配列）と添字付き配列を組み合わせてデータを保存する。JSONでは辞書のことを「オブジェクト」と呼ぶので、注意してほしい。

### オブジェクト（Object）

オブジェクトとは、キーと値のペアをコンマで区切って集めたもので、下のように中かっこ（{ }）の中に書く。

```json
{
    "key 1" : "value 1",
    "key 2" : "value 2",
    ...
    "key n" : "value n"
}
```

ここで「キー」は必ず文字列（引用符で囲んで書く）であり、「値」は次のいずれかの種類になる。

<table border="1" id="bkmrk-string-%28between-quot" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 34.4644%;"></col><col style="width: 65.6548%;"></col></colgroup><tbody><tr><td>文字列（引用符で囲む）

</td><td>```json
"player_name" : "ウルトラマン"
```

</td></tr><tr><td>整数</td><td>```json
 "XP" : 12345
```

</td></tr><tr><td>浮動小数点数（小数）</td><td>```json
"distance" : 31.145
```

</td></tr><tr><td>真偽値（true / false）</td><td>```json
"success" : true
```

</td></tr><tr><td>ほかのオブジェクトや配列</td><td>```json
"item_data" : 
  { 
    "name:" : "魔法のマント",
    "cost"  : 300
  }
```

</td></tr></tbody></table>

### 配列（Array）

配列とは、順番に並んだ値の集まりで、ふつうは同じ種類の値が入る。配列は角かっこ（\[ \]）を使って定義する。

```json
[
  "Apple", 
  "Banana", 
  "Grape"
]
```

JSONでは、同じ配列の中に違う種類の値を混ぜることもできる。少し変に見えるかもしれないが、これも可能である。

```json
[
  "Apple", 
  25, 
  false
]
```

### 例

JSONファイルは必ず、中かっこ（オブジェクトとして）か、角かっこ（配列として）のどちらかから始まる。この授業では、わかりやすいのでオブジェクトから始める形を使っていく。

セーブデータを扱うJSONを考えてみよう。日付、XP、HP、そしてクリアしたステージのリストを保存したいとする。すると、下のようになる。

```json
{
	"save_date" : "2026-07-14",
	"save_time" : "11:45",
	"XP" : 54796
	"HP" : 97.15
	"stage_cleared" : [true, true, false, false, true, false]
}
```

## JSONとPHPのデータ変換

JSONはウェブの場面でよく使われるため、PHPには次の2つの関数が用意されている。ひとつはPHPの連想配列をJSONのテキストに変換する関数、もうひとつはその逆の変換をする関数である。

<table border="1" id="bkmrk-from-php-associative" style="border-collapse: collapse; width: 100%; height: 84.4px;"><colgroup><col style="width: 50%;"></col><col style="width: 50%;"></col></colgroup><tbody><tr style="height: 66.2px;"><td style="height: 66.2px;">PHPの連想配列からJSONテキストへ</td><td style="height: 66.2px;">```php
$json = json_encode($dictionary);
```

</td></tr><tr style="height: 18.2px;"><td style="height: 18.2px;">JSONテキストからPHPの連想配列へ</td><td style="height: 18.2px;">```php
$dictionary = json_decode($json, true);
```

</td></tr></tbody></table>

## 練習

ここまで見てきたことを使って、簡単な練習をしてみよう。

- [このJSONファイル](https://class.illogic.games/attachments/28)をダウンロードし、自分のパソコンのXAMPPウェブサーバー（C:\\xampp\\htdocs）の中に置いてください。
- PHPの命令 `file_get_contents` を使って、このJSONファイルを読み込んでください（教科書80ページ）。
- `save_date` と `save_time` を、今の日付と時刻に変更してください（教科書40ページ）。
- 3つ目のステージ（インデックス2）をクリア済みにしてください（trueにする）。
- もう一度JSONのテキストに変換してください。
- ブラウザに表示されるように、そのJSONテキストを出力してください。

<details id="bkmrk-test_json.php-%3C%3Fphp-"><summary>test\_json.php</summary>

```php
<?php	
	// JSONを読み込む（テキスト）
	$json = file_get_contents("save_slot.json");

	// PHPの連想配列へ変換
	$data = json_decode($json, true);
	
	// 現在の日時にする
	$data["save_date"] = date("Y-m-d");
	$data["save_time"] = date("H:i:s");
	
	// 3つ目のステージをクリアにする
	$data["stage_cleared"][2] = true;
	
	// またJSONへ
	$json = json_encode($data);
	
	// 表示（返す）
	print($json);
?>
```

</details>#### JSONだと明示して返す

初期設定では、Apache（ウェブサーバー）は結果をHTMLファイルだと思い込んでいて、ブラウザにも「HTMLファイルが来る」と伝えてしまう。これは「ヘッダー」というものを使って行われていて、その中でデータの種類が指定されている。これは[MIMEタイプ](https://developer.mozilla.org/ja/docs/Web/HTTP/Guides/MIME_types/Common_types)と呼ばれるもので、一覧はリンク先で見ることができる。

今回は、結果がHTMLファイルではなくJSONファイルであることをブラウザに伝えたい。これは、PHPの `header()` という命令を使うことでできる。

```php
// JSONを返すべき
header("Content-Type: application/json; charset=utf-8");
```

先ほどの練習でヘッダーを変えてみて、結果がどう変わるか確認してください。