PHP で JSON からデータを抽出してアクセスするにはどうすればよいでしょうか? 質問する

PHP で JSON からデータを抽出してアクセスするにはどうすればよいでしょうか? 質問する

これは、終わりのない「JSON のデータにアクセスするにはどうすればいいですか?」という質問の多くをカバーする、一般的な参考となる質問と回答を目的としています。PHP で JSON をデコードして結果にアクセスするための幅広い基本事項を扱うためにここにあります。

JSONは次の通りです:

{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}

これを PHP でデコードして結果のデータにアクセスするにはどうすればよいですか?

ベストアンサー1

はじめに

まず、文字列があります。JSON は配列でも、オブジェクトでも、データ構造でもありません。翻訳はテキストベースのシリアル化形式です。つまり、派手な文字列ですが、あくまでも文字列です。PHPでデコードするには、json_decode()

 $data = json_decode($json);

そこには次のような内容が書かれています:

これらは JSON でエンコードできるものです。より正確に言うと、これらは JSON でエンコードできるものの PHP バージョンです。

特別なことは何もありません。これらは「JSONオブジェクト」でも「JSON配列」でもありません。JSONをデコードすると、基本的な日常的なPHP型

オブジェクトはインスタンスになります標準クラス組み込みクラスであり、一般的なものそれはここでは重要ではありません。


オブジェクトのプロパティにアクセスする

アクセスするとプロパティこれらのオブジェクトの 1 つのパブリック非静的プロパティは、他のオブジェクトのパブリック非静的プロパティの場合と同じ方法で取得できます (例: ) $object->property

$json = '
{
    "type": "donut",
    "name": "Cake"
}';

$yummy = json_decode($json);

echo $yummy->type; //donut

配列要素へのアクセス

これらの配列の要素には、他の配列と同じ方法でアクセスできます。たとえば、$array[0]

$json = '
[
    "Glazed",
    "Chocolate with Sprinkles",
    "Maple"
]';

$toppings = json_decode($json);

echo $toppings[1]; //Chocolate with Sprinkles

それを繰り返すforeach

foreach ($toppings as $topping) {
    echo $topping, "\n";
}

メープルのスプリンクルを添えたグレーズド
チョコレート

または、膨大な数の組み込み配列関数


ネストされたアイテムへのアクセス

オブジェクトのプロパティと配列の要素は、さらに多くのオブジェクトや配列である可能性があります。その場合、通常どおりにプロパティとメンバーにアクセスし続けるだけです。例$object->array[0]->etc:

$json = '
{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}';

$yummy = json_decode($json);

echo $yummy->toppings[2]->id; //5004

true2番目の引数として渡すjson_デコード()

これを行うと、オブジェクトの代わりに連想配列(キーに文字列を持つ配列)が得られます。ここでも、通常どおりにその要素にアクセスします。例$array['key']:

$json = '
{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}';

$yummy = json_decode($json, true);

echo $yummy['toppings'][2]['type']; //Maple

連想配列の項目へのアクセス

JSONオブジェクトをPHP連想配列にデコードする場合、キーと値の両方をforeach (array_expression as $key => $value)構文、例

$json = '
{
    "foo": "foo value",
    "bar": "bar value",
    "baz": "baz value"
}';

$assoc = json_decode($json, true);
foreach ($assoc as $key => $value) {
    echo "The value of key '$key' is '$value'", PHP_EOL;
}

プリント

キー「foo」の値は「foo value」です。
キー「bar」の値は「bar value」です。
キー「baz」の値は「baz value」です。


データがどのように構造化されているか分からない

JSON を取得する元のドキュメントを読んでください。

JSON を見てください。中括弧は{}オブジェクトを期待し、角括弧は[]配列を期待します。

デコードされたデータをprint_r():

$json = '
{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}';

$yummy = json_decode($json);

print_r($yummy);

出力を確認します:

stdClass Object
(
    [type] => donut
    [name] => Cake
    [toppings] => Array
        (
            [0] => stdClass Object
                (
                    [id] => 5002
                    [type] => Glazed
                )

            [1] => stdClass Object
                (
                    [id] => 5006
                    [type] => Chocolate with Sprinkles
                )

            [2] => stdClass Object
                (
                    [id] => 5004
                    [type] => Maple
                )

        )

)

オブジェクトがどこにあるのか、配列がどこにあるのか、またそのメンバーの名前と値がわかります。

迷子になる前にそこまでしか進めない場合は、そこまで行って、次のことを行ってくださいprint_r()

print_r($yummy->toppings[0]);
stdClass Object
(
    [id] => 5002
    [type] => Glazed
)

見てみましょうこの便利なインタラクティブJSONエクスプローラー

問題を、理解しやすいように細分化します。


json_decode()戻り値null

これは次のいずれかの理由で発生します:

  1. JSON は、まさにこれだけで構成されていますnull
  2. JSONが無効です - 結果を確認してくださいjson_last_error_msgまたは、次のようなものを使ってJSONリント
  3. 512レベル以上のネストされた要素が含まれます。このデフォルトの最大深度は、3番目の引数として整数を渡すことで上書きできます。json_decode()

最大深度を変更する必要がある場合は、おそらく間違った問題を解決していることになります。このように深くネストされたデータが取得される理由 (たとえば、クエリを実行して JSON を生成するサービスにバグがあるなど) を調べて、そのようなことが起こらないようにします。


オブジェクトプロパティ名に特殊文字が含まれています

場合によっては、リテラル識別子で使用できないハイフン-やアットマークなどを含むオブジェクト プロパティ名があることがあります。代わりに、中括弧内の文字列リテラルを使用して対処できます。@

$json = '{"@attributes":{"answer":42}}';
$thing = json_decode($json);

echo $thing->{'@attributes'}->answer; //42

プロパティとして整数がある場合は以下を参照してください:整数のような名前を持つオブジェクトのプロパティにアクセスするにはどうすればよいでしょうか?参考として。


誰かがあなたのJSONにJSONを入れました

馬鹿げているかもしれませんが、実際に起こります。JSON 内に文字列としてエンコードされた JSON があります。デコードし、通常どおり文字列にアクセスし、それをデコードして、最終的に必要なものに到達します。

$json = '
{
    "type": "donut",
    "name": "Cake",
    "toppings": "[{ \"type\": \"Glazed\" }, { \"type\": \"Maple\" }]"
}';

$yummy = json_decode($json);
$toppings = json_decode($yummy->toppings);

echo $toppings[0]->type; //Glazed

データがメモリに収まりきらない

JSON が大きすぎてjson_decode()一度に処理できない場合は、状況が複雑になり始めます。以下を参照してください。


並べ替え方法

見る:参考: PHP で配列とデータをソートする基本的な方法すべて

おすすめ記事