はじめに
まず、あなたはひもを持っています。JSONは、配列、オブジェクト、またはデータ構造ではありません。JSONはテキストベースのシリアル化フォーマットです。そのため、派手な文字列ですが、それでも単なる文字列です。PHPでを使用してデコードしjson_decode()
ます。
$data = json_decode($json);
そこにあなたは見つけるかもしれません:
これらは、JSONでエンコードできるものです。より正確には、これらはJSONでエンコードできるもののPHPのバージョンです。
それらについて特別なことは何もありません。「JSONオブジェクト」や「JSON配列」ではありません。JSONをデコードしました-これで基本的な日常のPHPタイプができました。
オブジェクトはstdClassのインスタンスになります。これは組み込みクラスであり、ここでは重要ではない一般的なものです。
オブジェクトプロパティへのアクセス
これらのオブジェクトのいずれかのプロパティには、他のオブジェクトのパブリックな非静的プロパティと同じようにアクセスします$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";
}
メープルグレープ
チョコレート
または、バジリオンの組み込み配列関数をいじってください。
ネストされたアイテムへのアクセス
オブジェクトのプロパティと配列の要素は、より多くのオブジェクトや配列である可能性があります$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
これを行うと、オブジェクトの代わりに連想配列(キーの文字列を含む配列)が得られます。繰り返しますが、通常どおりその要素にアクセスします$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
これは、次のいずれかの理由で発生します。
- JSONは、それだけで完全に構成されています
null
。
- JSONが無効です-結果を確認
json_last_error_msg
するか、JSONLintなどを使用してください。
- 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で配列とデータをソートするすべての基本的な方法。