Webブラウザから送られたJSONをPHPで利用するなら、php_decode関数を使います。しかし、そもそもJSONとは何か、また、php_decode関数から変換した変数のデータ形式が解らないとプログラムで利用できません。
そこで今回は、JSONの構造と、JSONをPHPで利用する際に使うphp_decode関数について、例を用いて詳しく解説します。
目次
PHPでJSONを利用する方法
JSONは、Webブラウザーで動作するJavaScriptがサーバーとのデータ通信に用いるデータフォーマットです。そしてJSONは、テキストベースのフォーマットのためPHPでも簡単に扱えます。
ではJSONとはどのようなフォーマットなのでしょうか。次からJSONの基本とPHPから利用する方法について説明します。
JSONとは何か
JSONとは、JavaScript Object Notationの略で日本語に直すとJavaScriptにおけるオブジェクトの表記方法です。そして、Webブラウザーで動作するJavaScriptとWebサーバーとの非同期通信で使われます。
JSONの書き方は、1つのデータをキーと値のペアで記述し、ペアとペアの間をコロン(:)で区切るフォーマットが基本です。そしてそれらを{}で囲ったデータが1つのオブジェクトとして扱われます。
簡単なJSONの例
1 |
{ "a":1, "b":2, "c":3, "d":4, "e":5 } |
また、値の代わりにJSONのオブジェクトを定義し、階層構造のJSONを作ることも可能です。
階層構造を持つJSONの例
1 2 3 4 5 6 7 |
{ "type": "Blog", "profile": { "name": "My Blog", "date": "2021-04-01" } } |
JSONは便利
JSONが使われる前はXMLというフォーマットが使われていました。なおXMLは、HTMLのようにタグでデータを囲むフォーマットで、どのようなデータでも記述できる反面タグが多く読みにくいフォーマットです。
その点、今使われるJSONは、1つのデータをキーと値のペアで記述する簡潔で読み易いテキストベースの便利なフォーマットです。そのためフロント側がJavaScript、バック側がPHPのWebシステムでもよく使われます。
JSONはPHPで簡単に扱うには
JSONはJavaScriptのデータフォーマットですが、PHPにはJSONを扱うための関数が用意されています。それらを使うことでJSONをプログラム内で簡単に扱えるので、ぜひ活用してください。
PHPの使えるJSON関数
- json_decode : JSON 文字列をデコードする
- json_encode : 値を JSON 形式にして返す
- json_last_error_msg : 直近の json_encode() や json_decode() の呼び出しのエラー文字列を返す
- json_last_error : 直近に発生したエラーを返す
ただし、JSONが比較的新しいデータフォーマットのため、古いPHPでは制限があるかもしれません。なお、PHPのバージョン7以降では、JSONに完全に対応した関数が利用できます。できるだけ最新版のPHPを利用してください。
json_decodeの基本
先ほど紹介したPHPの4つのJSONを扱う関数のうち、Webブラウザから非同期通信で送られたJSONデータを、PHPで利用するために使う関数がjson_decodeです。
もちろん、JSONを文字列として解析して連想配列に変換するプログラムを作ることは可能です。しかし、そのような手間のかかることをせずに用意してある関数を利用しましょう。
json_decodeの文法
先ほど紹介したように、json_decode関数は、JSONでフォーマットされた文字列をPHPの変数に変換する関数です。
json_decode関数の文法
- json_decode( JSON文字列、trueで連想配列/falseでオブジェクト, ネストの深さ, フラグ );
json_decode関数の引数としてJSON文字列は必須ですが、他は省略可能です。また、2番目の引数を省略した場合、json_decode関数はオブジェクトを返します。
JSONをオブジェクトに変換する例
1 |
$obj = json_decode( $json ) |
2番目の引数にtureを指定すると、JSONが連想配列に変換されます。
JSONを連想配列に変換する例
1 |
$arr = json_decode( $json, true ); |
json_decode関数がデコードに失敗したら
もし、json_decode関数がデコードに失敗したら、どうなるでしょうか。JSONのデータが破損してデコードできない場合、または、JSONに記載されたデータのネストが深すぎる場合、json_decode関数はnullを返します。
また、JSONデータそのものがnull、false、tureだった場合もnullを返します。非同期通信でエラーが発生した場合は、適切にエラー処理するプログラムを作っておきましょう。
1 2 3 4 5 |
<?php $json = null $arr = json_decode($json, true); var_dump($arr); // NULLが表示される ?> |
json_decodeで連想配列に変換した例
JSONを連想配列に変換する例を使い、json_decode関数の処理を具体的に紹介します。
JSONを連想配列に変換するPHPプログラム
1 2 3 4 5 |
<?php $json = '{ "a":1, "b":2, "c":3, "d":4, "e":5 }'; $arr = json_decode( $json, true ); var_dump($arr); ?> |
この例は、テキストの変数$jsonに用意したJSONを、json_decode関数を使って、連想配列$arrに変換しています。そして、$arrに格納された内容は次のとおりです。
1 2 3 4 5 6 7 |
array(5) { ["a"] => int(1) ["b"] => int(2) ["c"] => int(3) ["d"] => int(4) ["e"] => int(5) } |
そして、json_decode関数で作成した連想配列$arrは、JSONに記載されたキーを利用して参照できます。
JSONから変換した連想配列を利用した例
1 2 |
echo $arr["a"] . "\n"; // 1が表示されます echo $arr["b"] . "\n"; // 2が表示されます |
階層構造のJSONを連想配列に変換した例
json_decode関数を利用し、階層構造を持つJSONを連想配列に変換した例が次のとおりです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php $json = <<<EOF { "type": "Blog", "profile": { "name": "My Blog", "date": "2021-04-01" } } EOF $arr = json_decode( $json, true ); echo $arr['type'] . "\n"; // Blogが表示される echo $arr['profile']['name'] . "\n"; // My Bogが表示される echo $arr['profile']['data'] . "\n"; // 2021-04-01が表示される ?> |
この例では、’profile’のキーが階層を持っているので、連想配列に変換すると、$arr[‘profile’][‘name’]、および、$arr[‘profile’][‘data’]の2次の配列に変換されます。
このように、階層構造を持つJSONを連想配列に変換すると、多次元の配列に変換されます。ただし、ネストが深すぎるとエラーになり、正しく変換されないので注意してください。
ネストが深いJSONを処理する場合は、json_decode関数の引数でネスト数を限定し、深すぎる階層のデータを変換しないで連想配列に変換する、といった使い方も可能です。
扱える日本語コードはUTF-8のみ
JSON自体はただの文字列なので文字コードの指定はありません。しかし、JSONを扱うWebブラウザの非同期通信には、日本語の文字コードとしてUTF-8のみ使えるという制限があります。
そのため、json_decode関数で変換したデータに日本語が含まれている場合、その文字コードはUTF-8です。そのため、もし、PHP内部の文字コードをShift_JISなどにしていると文字化けします。
最近のWebシステムで、UTF-8以外の文字コードを使ったシステムは無いかもしれません。しかし、古いシステムなどで、文字コードにShift-JISを使っているケースもあります。日本語を扱う場合は、文字コードに注意してください。
まとめ
これまで説明したように、Webブラウザなどで動作するJavaScriptで使われるデータフォーマットがJSONであり、PHPで受け取ったJSONデータを連想配列に変換する関数がjson_decodeです。
ぜひ、PHPのjson_decode関数の使い方をマスターし、リッチなWebシステムの開発に役立ててください。