1. ホーム
  2. php

[解決済み】PHPでJSONからデータを抽出してアクセスする方法は?

2022-04-03 05:11:44

質問

<ブロッククオート

このページは JSONのデータにアクセスするにはどうしたらいいですか? という質問があります。ここでは、PHP で JSON をデコードし、その結果にアクセスするための基本的な事柄を扱います。

JSONを持っています。

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

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

どのように解決するのですか?

イントロ

まず、文字列がありますね。JSONは配列でも、オブジェクトでも、データ構造でもありません。 JSON はテキストベースのシリアライズフォーマットです。したがって、派手な文字列ですが、それでもただの文字列です。PHP でこれをデコードするには json_decode() .

 $data = json_decode($json);

そこに、あなたは見つけることができるかもしれません。

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

特別なことは何もない。JSONオブジェクトでもなければ、JSON配列でもありません。 日常的な PHP の基本的な型 .

のインスタンスになります。 stdClass という組み込みクラスで、これは単に 汎用的なもの というのは、ここでは重要ではありません。


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

にアクセスします。 プロパティ これらのオブジェクトのひとつは、他のオブジェクトのパブリックな非静的プロパティと同じ方法で使用できます。 $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


パッシング true の第2引数として json_decode()

この場合、オブジェクトの代わりに連想配列、つまりキーに文字列を持つ配列が得られます。ここでも通常通り、その要素にアクセスする。 $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 のようなものに通すか JSONLint .
  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で配列やデータをソートするすべての基本的な方法 .