JSONとPHP
JSONのファイル形式について
JSONとは、テキストファイルの中にデータを保存し、整理するための方法である。ウェブアプリケーションでよく使われていて、クライアントとサーバーの間でデータをやりとりするときによく使われる。
JSONファイルの中では、辞書(連想配列)と添字付き配列を組み合わせてデータを保存する。JSONでは辞書のことを「オブジェクト」と呼ぶので、注意してほしい。
オブジェクト(Object)
オブジェクトとは、キーと値のペアをコンマで区切って集めたもので、下のように中かっこ({ })の中に書く。
{
"key 1" : "value 1",
"key 2" : "value 2",
...
"key n" : "value n"
}
ここで「キー」は必ず文字列(引用符で囲んで書く)であり、「値」は次のいずれかの種類になる。
|
文字列(引用符で囲む) |
|
| 整数 |
|
| 浮動小数点数(小数) |
|
| 真偽値(true / false) |
|
| ほかのオブジェクトや配列 |
|
配列(Array)
配列とは、順番に並んだ値の集まりで、ふつうは同じ種類の値が入る。配列は角かっこ([ ])を使って定義する。
[
"Apple",
"Banana",
"Grape"
]
JSONでは、同じ配列の中に違う種類の値を混ぜることもできる。少し変に見えるかもしれないが、これも可能である。
[
"Apple",
25,
false
]
例
JSONファイルは必ず、中かっこ(オブジェクトとして)か、角かっこ(配列として)のどちらかから始まる。この授業では、わかりやすいのでオブジェクトから始める形を使っていく。
セーブデータを扱うJSONを考えてみよう。日付、XP、HP、そしてクリアしたステージのリストを保存したいとする。すると、下のようになる。
{
"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のテキストに変換する関数、もうひとつはその逆の変換をする関数である。
| PHPの連想配列からJSONテキストへ |
|
| JSONテキストからPHPの連想配列へ |
|
練習
ここまで見てきたことを使って、簡単な練習をしてみよう。
- このJSONファイルをダウンロードし、自分のパソコンのXAMPPウェブサーバー(C:\xampp\htdocs)の中に置いてください。
- PHPの命令
file_get_contentsを使って、このJSONファイルを読み込んでください(教科書80ページ)。 save_dateとsave_timeを、今の日付と時刻に変更してください(教科書40ページ)。- 3つ目のステージ(インデックス2)をクリア済みにしてください(trueにする)。
- もう一度JSONのテキストに変換してください。
- ブラウザに表示されるように、そのJSONテキストを出力してください。
test_json.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);
?>
JSONだと明示して返す
初期設定では、Apache(ウェブサーバー)は結果をHTMLファイルだと思い込んでいて、ブラウザにも「HTMLファイルが来る」と伝えてしまう。これは「ヘッダー」というものを使って行われていて、その中でデータの種類が指定されている。これはMIMEタイプと呼ばれるもので、一覧はリンク先で見ることができる。
今回は、結果がHTMLファイルではなくJSONファイルであることをブラウザに伝えたい。これは、PHPの header() という命令を使うことでできる。
// JSONを返すべき
header("Content-Type: application/json; charset=utf-8");
先ほどの練習でヘッダーを変えてみて、結果がどう変わるか確認してください。
No comments to display
No comments to display