目次
いつからか
いつからか JSON という文字の羅列をウェブサイト作成関係のサイトで頻繁に見かけるようになりました。 Javascript の Ajax で JSON データをやりとりするとか、 WebAPI サービスが JSON 形式でデータを提供しているとか、 XML よりデータが軽量であるとか。色々と。
その後、 JSON は単なる文字の羅列などではなく、ひとつの用語であり、正式な仕様であることを知りました。しかも読み方は「ジェイソン」とのことです。少々戦慄。
JSON のテスト
早速、PHP で JSON 形式のデータを扱うテストをやってみたいと思います。 JSON にどこから入るという決まりはないのかもしれませんが、私の作りたいプログラムは PHP で処理することが要なので PHP での JSON の処理をテストしてみます。 Javascript で JSON を使用したことがないので順番が違う感もあります。
ステップ 1 ~ 3 までありますが、良ければお付き合いください。
ステップ 1. JSON データの作成
まずは、 PHP: json_decode - Manual の情報を参考にして JSON データの作成から始めてみます。例として、下記の画像の Excel の表に書かれたリストを JSON 仕様の書き方で表現してみたいと思います。ただし 1 行目の「名前」「値」は含めません。
Excel の表 :
PHP のコード :
<?php
$json = '{ "key1":"value1" , "key2":"value2" }'; //JSON 仕様の文字列
?>
キー(名前)と値が一対になっていて、複数の場合はカンマ( , )で区切る。これは PHP の連想配列に似た書式ですね。
先頭と末尾の波括弧( { } )と、キーと値の間のコロン( : )は JSON の仕様のようです。 キーと文字列の値をダブルクオーテーション( " )で囲むのも JSON の仕様なようで、文字列を囲むのにシングルクォーテーション( ' )は使えないようです。
値が文字列ではなく、数値、 true , false の真偽値、配列、オブジェクト、 null の場合は、ダブルクオーテーションで囲む必要はないようです。
ここで定義した変数 $json は、今の段階では文字列になっていると思います。 var_dump() して確認してみましょう。
PHP のコード :
<?php $json = '{ "key1":"value1" , "key2":"value2" }'; //JSON 仕様の文字列 var_dump( $json ); //ブラウザに出力 ?>
var_dump の出力結果 :
string(37) "{ "key1":"value1" , "key2":"value2" }" //string が文字という意味です。
string で文字列になっていますね。この文字列から key1 , key2 の値を取り出すのは、至難の技を必要としそうですので、次のステップでこの JSON 仕様の文字列を PHP のオブジェクト、配列に変換してリストデータとして扱いやすくしたいと思います。
ステップ 2. PHP の json_decode() でオブジェクト、配列に変換
JSON 仕様の文字列を PHP のオブジェクト、配列に変換するには、 PHP の json_decode 関数を使用します。それでは実際にやってみます。
PHP のコード :
<?php $json = '{ "key1":"value1" , "key2":"value2" }'; // JSON 仕様の文字列 $obj = json_decode( $json ); //オブジェクトを返す $ary = json_decode( $json , true ); //第 2 引数に true を指定すると連想配列を返す var_dump( $obj ); //ブラウザに出力 var_dump( $ary ); //ブラウザに出力 ?>
変数 $obj を var_dump した結果 :
object(stdClass)#2303 (2) { // object になっている
["key1"]=>
string(6) "value1"
["key2"]=>
string(6) "value2"
}
変数 $ary を var_dump した結果 :
array(2) { //連想配列になっている
["key1"]=>
string(6) "value1"
["key2"]=>
string(6) "value2"
}
上記の出力結果を見ると、 $obj の出力は object でオブジェクト、 $ary の出力は array で配列に変換されていますね。配列は連想配列になっているので、キー名で値の取得が可能なので後でデータの順番が変わっても目的の値は変わらないので利便性が高いです。
ここまでくれば、 PHP での値の取り出しも容易になりますので、次のステップで値の取得を試してみます。
ステップ 3. JSON データの利用
それでは json_decode 関数で変換済みの JSON データから値を取り出してみます。
まずは、変数 $obj に格納されている値を取得します。
PHPコード :
<?php var_dump( $obj->key1 ); // echo のほうがよいかもしれない var_dump( $obj->key2 ); // var_dump である必要はない ?>
出力結果 :
string(6) "value1" //文字列 string(6) "value2" //文字列
次は、変数 $ary に格納されている値を取得します。
PHPコード :
<?php var_dump( $ary[ "key1" ] ); //連想配列なのでキー名でアクセスできる var_dump( $ary[ "key2" ] ); //連想配列なので順序を気にしない ?>
出力結果 :
string(6) "value1" //文字列 string(6) "value2" //文字列
とりあえず、JSON データの作成、変換、値の取得まで出来ましたね。
JSON のテスト(多次元)
今度は、多次元の JSON データを作成、変換して値を取得してみたいと思います。多次元とは JSON データが入れ子になっていて階層をもっている状態です。
ステップ 1 ~ 3 までありますが、良ければお付き合いください。
ステップ 1. 多次元 JSON データの作成
例として下記の画像の Excel の表を JSON 仕様の文字列で表現してみます。
oya_key1 の中に ko_key1 ~ ko_key3 、 oya_key2 の中に ko_key1 ~ ko_key3 があるというリストです。ただし 1 行目の「名前 1 」「名前 2 」「値」は含めません。
Excel の表 :
PHP のコード :
<?php $json = '{ "oya_key1":{ // 1 次元目の 1 番目のキーで値はオブジェクトです "ko_key1":"value1" , // 2 次元目のキーと値 "ko_key2":"value2" , // 2 次元目のキーと値 "ko_key3":"value3" // 2 次元目のキーと値 } , "oya_key2":{ // 1 次元目の 2 番目のキーで値はオブジェクトです "ko_key1":"value1" , // 2 次元目のキーと値 "ko_key2":"value2" , // 2 次元目のキーと値 "ko_key3":"value3" // 2 次元目のキーと値 } }'; ?>
上の上の Excel の表画像と、上の PHP のコードを照らしあわせてみると、多次元 JSON データの記述方法の大体のイメージがつくでしょうか。とはいっても、私もこの書き方で良いのかよくわかっていませんが。
それでは、次のステップで JSON データの変換と結果確認まで行います。
ステップ 2. 多次元の JSON データを json_decode() でオブジェクト、配列に変換
単次元の時と同様に json_decode で JSON データの変換を行います。
PHP のコード :
<?php $obj = json_decode( $json ); //オブジェクトという形式に変換されるようです。 $ary = json_decode( $json , true ); //第 2 のパラメータに true を指定すると、配列になるようです。 var_dump( $obj ); //ここはオブジェクトの中身が表示されるはずです。 var_dump( $ary ); //ここは配列の中身が表示されるはずです。 ?>
変数 $obj を var_dump した結果 :
object(stdClass)#2312 (2) { ["oya_key1"]=> object(stdClass)#77 (3) { ["ko_key1"]=> string(6) "value1" ["ko_key2"]=> string(6) "value2" ["ko_key3"]=> string(6) "value3" } ["oya_key2"]=> object(stdClass)#2313 (3) { ["ko_key1"]=> string(6) "value1" ["ko_key2"]=> string(6) "value2" ["ko_key3"]=> string(6) "value3" } }
変数 $ary を var_dump した結果 :
array(2) { ["oya_key1"]=> array(3) { ["ko_key1"]=> string(6) "value1" ["ko_key2"]=> string(6) "value2" ["ko_key3"]=> string(6) "value3" } ["oya_key2"]=> array(3) { ["ko_key1"]=> string(6) "value1" ["ko_key2"]=> string(6) "value2" ["ko_key3"]=> string(6) "value3" } }
oya_key の中に ko_key が格納されていて、階層をもったデータ構造になっていますね。多次元 JSON データの作成がうまく出来たのかもしれませんね。
次は、データの取得を行ってみます。
オブジェクトの階層を下っていくのは、 $obj->oya_key1->ko_key1 で良いのでしょうか。やったことのないパターンです。試してみましょう。
ステップ 3. 多次元 JSON データの利用
まずは、変数 $obj に格納されている値を取得します。値の数が多いので 2 次元目の最初のキーの値のみを取得します。
PHPコード :
<?php var_dump( $obj->oya_key1->ko_key1 ); var_dump( $obj->oya_key2->ko_key1 ); ?>
出力結果 :
string(6) "value1" string(6) "value1"
次は、変数 $ary に格納されている値を取得します。
PHPコード :
<?php var_dump( $ary[ "oya_key1" ][ "ko_key1" ] ); var_dump( $ary[ "oya_key2" ][ "ko_key2" ] ); ?>
出力結果 :
string(6) "value1" string(6) "value1"
多次元の JSON データの作成、変換、値の取得も出来ました。
参考情報
Wikipedia
あとがき
PHP のオブジェクト、配列になった状態が JSON データだと思っていましたが、文字列の状態で JSON データなのかもしれません。 decode でオブジェクト、配列になり、 encode で文字列になる。逆だと思っていました。いちおう JSON データを扱うことが出来ました。
以上、閲覧ありがとうございました。