English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

PHP基本チュートリアル

PHP上級チュートリアル

PHP & MySQL

PHPリファレンスマニュアル

PHP JSON 解析

このチュートリアルでは、PHPでJSONデータをエンコードおよびデコードする方法を学びます。

JSONとは何か

N OTCE JB ON

JSONとXMLと同様に、テキストベースのフォーマットであり、人間とコンピュータにとって簡単に書きやすく理解しやすいですが、XMLとは異なり、JSONデータ構造が占める帯域幅はXMLバージョンよりも少ないです。JSONは以下の2つの基本構造に基づいています:

  • オブジェクト:これはキーとして定義されます/値対(キー:バリュー)の集合です。各オブジェクトは左花括弧{で始まり、右花括弧}で終わります。複数のキー/値対はカンマで区切られます。

  • 配列:定義された値の順序付きリストです。配列は左括弧で始まり、右括弧[で終わります。値はカンマで区切られます。

JSONでは、キーは常に文字列であり、値はstringnumbertrueまたはfalsenullまたは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アプリケーションで最も人気があり、軽量なデータ交換フォーマットです。

PHPでJSONを解析する

JSONデータ構造はPHP配列と非常に似ています。PHPにはJSONデータをエンコードおよびデコードするための内蔵関数があります。これらの関数はjson_encode()とjson_decode()です。これらの関数はUTF-8エンコードされた文字列データです。

PHPでJSONデータをエンコードする

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":"オレンジ"}

上記の例でご覧いただけるように、非連想配列は配列またはオブジェクトにエンコードできますが、連想配列は常にオブジェクトとしてエンコードされます。

PHPでJSONデータをデコードする

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>";
}
?>
テストしてみる‹/›

PHPのネストされたJSONデータから値を抽出します

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
?>
テストしてみる‹/›