web-dev-qa-db-ja.com

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でデコードして結果のデータにアクセスする方法を教えてください。

178
Paul

イントロ

まず、あなたは文字列を持っています。 JSONは配列、オブジェクト、またはデータ構造ではありません。 _ json _ はテキストベースのシリアル化フォーマットです。つまり派手な文字列ですが、それでも単なる文字列です。 json_decode() を使用してPHPにデコードします。

 $data = json_decode($json);

そこにあなたが見つけるかもしれません:

これらはJSONでエンコードできるものです。もっと正確に言うと、これらはJSONでエンコードできるもののPHP版です。

それらについて特別な何もありません。それらは「JSONオブジェクト」でも「JSON配列」でもありません。あなたはJSONをデコードしました - あなたは今 - 基本的な毎日PHPタイプを持っています

オブジェクトは stdClass のインスタンスになるでしょう。これは 一般的なものです ここでは重要ではありません。


オブジェクトプロパティへのアクセス

これらのオブジェクトの1つの properties にアクセスするには、他のオブジェクトのpublicの非静的プロパティと同じ方法を使用します。 $object->property

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

$yummy = json_decode($json);

echo $yummy->type; //donut

配列要素へのアクセス

これらの配列の1つの要素には、他の配列の場合と同じ方法でアクセスします。 $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";
}

艶をかけられた
振りかけるチョコレート
もみじ

あるいは bazillionの組み込み配列関数 を使ってみてください。


ネストした項目にアクセスする

オブジェクトのプロパティと配列の要素は、より多くのオブジェクトや配列になることがあります。通常どおり、単にそれらのプロパティとメンバにアクセスし続けることができます。 $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

2番目の引数としてtruejson_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を取得しているものが何であれ、ドキュメントを読んでください。

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
                )

        )

)

オブジェクトの場所、配列の場所、それらのメンバーの名前と値がわかります。

迷子になる前にそれまでのところまでしか深く理解できないのなら、遠くに行って that 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レベル以上の深さにネストした要素を含みます。このデフォルトの最大深度は、 json_decode() の3番目の引数として整数を渡すことで上書きできます。

最大深度を変更する必要がある場合は、おそらく間違った問題を解決しています。なぜあなたがこんなに深く入れ子になったデータ(例えば、JSONを生成していることを問い合わせているサービスにバグがある)を得ているのか調べて、それが起こらないようにしてください。


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

時々、ハイフン-やサイン@のような何かを含むオブジェクトプロパティ名があるかもしれませんが、それはリテラル識別子では使用できません。その代わりに、中括弧内で文字列リテラルを使用してそれに対処することができます。

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

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

あなたがプロパティとして整数を持っているならば: 整数のような名前でオブジェクトプロパティにアクセスする方法? 参照として。


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

ばかげているがそれは起こる - あなたのJSON内の文字列としてエンコードされたJSONがある。デコードして、いつものように文字列にアクセスし、 that をデコードして、最終的に必要なものにします。

$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 内の配列とデータをソートするための基本的な方法すべて。

356
Paul

json_decode() を使用すると、json文字列をPHP object/arrayに変換できます。

例えば。

入力:

$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

var_dump(json_decode($json));
var_dump(json_decode($json, true));

出力:

object(stdClass)#1 (5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}

array(5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}

覚えるべき少数のポイント:

  • json_decodeは文字列が有効なjsonであることを要求します。それ以外の場合はNULLを返します。
  • デコードに失敗した場合、 json_last_error() を使用してエラーの正確な性質を判断できます。
  • 必ずutf8の内容を渡してください。そうしないとjson_decodeがエラーになり、NULLの値が返される可能性があります。
12