これは終わりのない 「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 _ はテキストベースのシリアル化フォーマットです。つまり派手な文字列ですが、それでも単なる文字列です。 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
true
を 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を取得しているものが何であれ、ドキュメントを読んでください。
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
を返します これは次のいずれかの理由で発生します。
null
。json_last_error_msg
の結果を確認するか、 JSONLint のように入力してください。json_decode()
の3番目の引数として整数を渡すことで上書きできます。最大深度を変更する必要がある場合は、おそらく間違った問題を解決しています。なぜあなたがこんなに深く入れ子になったデータ(例えば、JSONを生成していることを問い合わせているサービスにバグがある)を得ているのか調べて、それが起こらないようにしてください。
時々、ハイフン-
やサイン@
のような何かを含むオブジェクトプロパティ名があるかもしれませんが、それはリテラル識別子では使用できません。その代わりに、中括弧内で文字列リテラルを使用してそれに対処することができます。
$json = '{"@attributes":{"answer":42}}';
$thing = json_decode($json);
echo $thing->{'@attributes'}->answer; //42
あなたがプロパティとして整数を持っているならば: 整数のような名前でオブジェクトプロパティにアクセスする方法? 参照として。
ばかげているがそれは起こる - あなたの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 内の配列とデータをソートするための基本的な方法すべて。
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
の値が返される可能性があります。