English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
このチュートリアルでは、PHPでJSONデータをエンコードおよびデコードする方法を学びます。
N OTCE JB ON
JSONとXMLと同様に、テキストベースのフォーマットであり、人間とコンピュータにとって簡単に書きやすく理解しやすいですが、XMLとは異なり、JSONデータ構造が占める帯域幅はXMLバージョンよりも少ないです。JSONは以下の2つの基本構造に基づいています:
オブジェクト:これはキーとして定義されます/値対(キー:バリュー)の集合です。各オブジェクトは左花括弧{で始まり、右花括弧}で終わります。複数のキー/値対はカンマで区切られます。
配列:定義された値の順序付きリストです。配列は左括弧で始まり、右括弧[で終わります。値はカンマで区切られます。
JSONでは、キーは常に文字列であり、値はstring、number、trueまたはfalse、nullまたはobjectまたはarray。文字列はダブルクォート("")で括られ、エスケープシーケンス(例:\n、\t、\)を含むことができます。JSONオブジェクトは以下のようになります:
{ "book": { "name": "Harry Potter and the Goblet of Fire", "author": "J. K. Rowling", "year": 2000, "genre": "Fantasy Fiction", "bestseller": true } }
以下に示すように、JSON配列の例があります:
{ "fruits": [ "Apple", "Banana", "Strawberry", "Mango" ] }
ヒント:データ交換フォーマットは、異なるプラットフォームやオペレーティングシステム間でデータを交換するためのテキストフォーマットです。JSONは、Webアプリケーションで最も人気があり、軽量なデータ交換フォーマットです。
JSONデータ構造はPHP配列と非常に似ています。PHPにはJSONデータをエンコードおよびデコードするための内蔵関数があります。これらの関数はjson_encode()とjson_decode()です。これらの関数はUTF-8エンコードされた文字列データです。
PHPでは、json_encode()関数を使用して値をJSON形式にエンコードします。エンコードされる値はリソース以外のすべてのPHPデータタイプ、例えばデータベースやファイルハンドル。以下の例では、PHP連想配列JSONオブジェクトにエンコードされます:
<?php //連想配列 $marks = array("ピーター"=>65, "ハリー"=>80, "ジョン"=>78, "クラーク"=>90); echo json_encode($marks); ?>テストしてみる‹/›
上記の例の出力は以下のようになります:
{"ピーター":65,"Harry":80,"John":78,"Clark":90}
同様に、PHPインデックス配列以下のようにJSON配列にエンコードされます:
<?php //インデックス配列 $colors = array("赤", "緑", "青", "オレンジ", "黄色"); echo json_encode($colors); ?>テストしてみる‹/›
上記の例の出力は以下のようになります:
["赤","緑","青","オレンジ","黄色"]
JSON_FORCE_OBJECTオプションを使用して、json_encode()関数を強制的にPHPインデックス配列としてJSONオブジェクトとして返すことができます。以下の例を参照してください:
<?php //インデックス配列 $colors = array("赤", "緑", "青", "オレンジ"); echo json_encode($colors, JSON_FORCE_OBJECT); ?>テストしてみる‹/›
上記の例の出力は以下のようになります:
{"0":"赤","1":"緑","2":"青","3":"オレンジ"}
上記の例でご覧いただけるように、非連想配列は配列またはオブジェクトにエンコードできますが、連想配列は常にオブジェクトとしてエンコードされます。
JSONデータをエンコードするのと同様に、JSONデータをデコードするのは非常に簡単です。PHPのjson_decode()関数を使用して、JSONエンコードされた文字列を適切なPHPデータタイプに変換することができます。以下の例では、JSONオブジェクトをデコードまたは変換する方法を示します。PHPオブジェクト。
<?php //JSONデータをPHP変数に保存します $json = '{"Peter":65,"Harry":80,"John":78,"Clark":90}'; var_dump(json_decode($json)); ?>テストしてみる‹/›
上記の例の出力は以下の通りです:
object(stdClass)#1 (4) { ["Peter"]=> int(65) ["Harry"]=> int(8) ["John"]=> int(78) ["Clark"]=> int(90) }
デフォルトでは、json_decode()関数はオブジェクトを返します。しかし、2番目の引数$assocを指定することで、JSONオブジェクトが連想配列にデコードされるように設定できます。このパラメータはブール値を受け取り、trueに設定すると、JSONオブジェクトが連想配列にデコードされます。デフォルトはfalseです。以下に例を示します:
<?php //JSONデータをPHP変数に保存します $json = '{"Peter":65,"Harry":80,"John":78,"Clark":90}'; var_dump(json_decode($json, true)); ?>テストしてみる‹/›
上記の例の出力は以下の通りです:
array(4) { ["Peter"]=> int(65) ["Harry"]=> int(8) ["John"]=> int(78) ["Clark"]=> int(90) }
以下の例では、JSONデータをデコードし、PHPのJSONオブジェクトや配列の各要素にアクセスする方法を示します。
<?php //JSONエンコードの文字列をPHP変数に割り当てる $json = '{"Peter":65,"Harry":80,"John":78,"Clark":90}'; //JSONデータをPHP連想配列にデコードします $arr = json_decode($json, true); //連想配列から値にアクセスします echo $arr["Peter"]; //出力: 65 echo $arr["Harry"]; //出力: 80 echo $arr["John"]; //出力: 78 echo $arr["Clark"]; //出力: 90 //JSONデータをPHPオブジェクトにデコードします $obj = json_decode($json); //返されたオブジェクトから値にアクセスします echo $obj->Peter; //出力: 65 echo $obj->Harry; //出力: 80 echo $obj->John; //出力: 78 echo $obj->Clark; //出力: 90 ?>テストしてみる‹/›
次のように使用することもできますforeach()以下のようにデコードされたデータをループします:
<?php //JSONエンコードの文字列をPHP変数に割り当てる $json = '{"Peter":65,"Harry":80,"John":78,"Clark":90}'; //JSONデータをPHP連想配列にデコードします $arr = json_decode($json, true); //連想配列をループします foreach($arr as $key=>$value){ echo $key . "=>" . $value . "<br>"; } echo "<hr>"; //JSONデータをPHPオブジェクトにデコードします $obj = json_decode($json); //オブジェクトをループします foreach($obj as $key=>$value){ echo $key . "=>" . $value . "<br>"; } ?>テストしてみる‹/›
JSONオブジェクトと配列もネストできます。JSONオブジェクトは、他のJSONオブジェクト、配列、ネストされた配列、JSONオブジェクトの配列などを任意に含むことができます。以下の例では、ネストされたJSONオブジェクトをデコードし、PHPですべての値を印刷する方法を示します。
<?php //ネストされた値を抽出するための再帰関数を定義します function printValues($arr) { global $count; global $values; //入力が配列であるか確認します if(!is_array($arr)){ die("エラー:入力が配列ではありません"); } /* 配列をループし、valueが配列である場合、再帰的に呼び出します 関数は見つかった値を出力項目配列に追加する 見つかった各値に対してカウンタを増加させる1 */ foreach($arr as $key=>$value){ if(is_array($value)){ printValues($value); } else{ $values[] = $value; $count++; } } // 配列内で見つかった合計数と値を返す return array('total' => $count, 'values' => $values); } //JSONエンコードの文字列をPHP変数に割り当てる $json = '{ "book": { "name": "Harry Potter and the Goblet of Fire", "author": "J. K. Rowling", "year": 2000, "characters": ["Harry Potter", "Hermione Granger", "Ron Weasley"], "genre": "Fantasy Fiction", "price": { "paperback": "$10.40", "hardcover": "$20.32", "kindle": "4.11" } } }'; //JSONデータをPHP連想配列形式にデコードする $arr = json_decode($json, true); //この関数を呼び出し、すべての値を印刷する $result = printValues($arr); echo "<h3>" . $result["total"] . " value(s) found: </h3>"; echo implode("<br>", $result["values"]); echo "<hr>"; //値を印刷する echo $arr["book"]["author"] . "<br>"; //出力: J. K. Rowling echo $arr["book"]["characters"][0] . "<br>"; //出力: Harry Potter echo $arr["book"]["price"]["hardcover"]; //出力: $20.32 ?>テストしてみる‹/›