[解決済み】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でデコードして、結果のデータにアクセスするにはどうしたらよいでしょうか?
どのように解決するのですか?
イントロ
まず、文字列がありますね。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
このようなことが起こるのは、以下のどちらかです。
-
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で配列やデータをソートするすべての基本的な方法 .
関連
-
[解決済み] PHP と mod_fcgid: handle_request_ipc 関数で ap_pass_brigade が失敗する。
-
[解決済み] cURLでJSONデータをPOSTするにはどうすればよいですか?
-
[解決済み] PHPで配列から要素を削除する
-
[解決済み] PHPでSQLインジェクションを防ぐにはどうしたらいいですか?
-
[解決済み] PHPでHTML/XMLをパースして処理する方法とは?
-
[解決済み] Microsoft JSONの日付はどのようにフォーマットするのですか?
-
[解決済み] JSONデータをファイルに書き込むにはどうしたらいいですか?
-
[解決済み] PHPスクリプトからJSONを返す
-
[解決済み】PHPの'foreach'は実際どのように動作するのですか?
-
[解決済み】なぜPythonはこのJSONデータをパースできないのですか?[終了] PythonがこのJSONデータをパースできないのはなぜですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】不明なMySQLサーバーのホスト
-
[解決済み】「初期通信パケットの読み込み」でMySQLサーバーに接続できなくなり、システムエラーになる。0
-
[解決済み】PHP 7.2 - Warning: count(): パラメータは配列かCountableを実装したオブジェクトでなければならない [解決済み]
-
[解決済み】foreach()に与えられた引数が無効です。)
-
[解決済み] PHP - ストリームを開くのに失敗しました : そのようなファイルまたはディレクトリがありません。
-
MacでPHPを実行した際に、メモリサイズが134217728バイトも消費される問題の解決方法について
-
[解決済み】Fatal error: mysqli_result 型のオブジェクトは使用できません [終了] 。
-
[解決済み] Forbidden :このサーバーの /phpmyadmin にアクセスする権限がありません。
-
[解決済み] mysql_field_nameを新しいmysqliに変更します。
-
[解決済み] PHPでJSONファイルをパースするにはどうしたらいいですか?[重複しています]