PHPを使用してJSONからデータを抽出するにはどうすればよいですか?

229
user3942918 2015-03-28 09:38.

これは、終わりのない「JSONのデータにアクセスするにはどうすればよいですか?」の多くをカバーする一般的な参照の質問と回答を目的としています。質問。ここでは、PHPでJSONをデコードし、結果にアクセスするための幅広い基本を処理します。

私はJSONを持っています:

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

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

5 answers

460
user3942918 2015-03-28 09:38.

イントロ

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

 $data = json_decode($json);

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

これらはJSONでエンコードできるものです。もっと正確に言えば、これらはJSONでエンコードできるもののPHPバージョンです。

それらについて特別なことは何もありません。それらは「JSONオブジェクト」または「JSON配列」ではありません。JSONをデコードしました。これで、基本的な日常のPHPタイプができました

オブジェクトはstdClassのインスタンスになります。これは組み込みクラスであり、ここでは重要ではない一般的なものです。


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

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

json_decode()trueへの2番目の引数として渡す

これを行うと、オブジェクトの代わりに連想配列(キーの文字列を含む配列)が取得されます。ここでも、通常どおりその要素にアクセスします$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」の値は「foovalue」です。
キー「bar」
の値は「barvalue」です。キー「baz」の値は「bazvalue」です。


データがどのように構成されているかわからない

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で配列とデータを並べ替えるにはどうすればよいですか?

19
Mohd Abdul Mujib 2016-10-27 03:24.

json_decode()を使用して、json文字列をPHPオブジェクト/配列に変換できます。

例えば。

入力:

$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値が返される可能性があります。
2
Sayeed amin 2019-11-07 02:31.
// Using json as php array 

$json = '[{"user_id":"1","user_name":"Sayeed Amin","time":"2019-11-06 13:21:26"}]';

//or use from file
//$json = file_get_contents('results.json');

$someArray = json_decode($json, true);

foreach ($someArray as $key => $value) {
    echo $value["user_id"] . ", " . $value["user_name"] . ", " . $value["time"] . "<br>";
}
1
Kankatala Krishna 2019-08-06 20:08.

phpのjson_decode関数を使用してjson文字列を配列にデコードできます

1)json_decode($ json_string)//オブジェクトを返します

2)json_decode($ json_string、true)//配列を返します

$json_string = '{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}';
$array = json_decode($json_string,true);

echo $array['type']; //it gives donut
0
Paul Burilichev 2020-01-23 04:48.

https://packagist.org/packages/flow/jsonpathの使用を検討してJSONPath ください

それを使用し、提案されたすべてのループを回避してJSONファイル解析する方法についてはかなり明確な説明があります。あなたがに精通しXPathているなら、あなたはXMLこのアプローチを愛し始めるでしょう。

Related questions

MORE COOL STUFF

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは、夫に会ったとき、典型的な交際のアドバイスに逆らいました。

マイケルシーンが非営利の俳優である理由

マイケルシーンが非営利の俳優である理由

マイケルシーンは非営利の俳優ですが、それは正確にはどういう意味ですか?

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。

「たどりつけば」をオンラインでストリーミングできない理由

「たどりつけば」をオンラインでストリーミングできない理由

ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

サロンからのヘアトリミングや個人的な寄付は、油流出を吸収して環境を保護するのに役立つマットとして再利用できます。

ホワイトハウスの最も記憶に残る結婚式を見てください

ホワイトハウスの最も記憶に残る結婚式を見てください

過去200年以上の間にホワイトハウスで結婚したのはほんの数人です。彼らは誰でしたか、そしてそこで結婚式を獲得するために何が必要ですか?

アトランタのドナ・ブラジル:「私があなたに私の話をするとき私を踏まないでください」

アトランタのドナ・ブラジル:「私があなたに私の話をするとき私を踏まないでください」

2017年11月19日にアトランタで開催されたドナブラジルとモーアイボリー(ダグスミスフォトグラフィー)ドナブラジルを見逃すことはありません。

彼らは北朝鮮から脱出した亡命者の胃の中に奇妙な寄生虫を見つけました

彼らは北朝鮮から脱出した亡命者の胃の中に奇妙な寄生虫を見つけました

画像:ゲッティ陰謀愛好家は新しくてエキサイティングなディスカッション資料を持っています:国境を越えて韓国に5発撃たれた北朝鮮の脱北者は寄生虫でいっぱいで、そのうちの1人は南のメディアは、寄生虫を持った北朝鮮の脱北者を見つけることは珍しいことではないと報告している、実際、男性が30以上のタイプを持っていたケースがあった。

パニッシャーの第2話は、複雑な陰謀の網を織り交ぜています

パニッシャーの第2話は、複雑な陰謀の網を織り交ぜています

写真:パニッシャー(Netflix)これらのMarvel Netflixが愛していることが1つあるとすれば、それは複雑な政府や企業の陰謀です。そして、なぜこれらのショーがそのルートを選択するのかを理解するのは簡単です。

最新のBoseヘッドフォンは音楽を聴くためのものではなく、パートナーの鼻を鳴らすためのものです。

最新のBoseヘッドフォンは音楽を聴くためのものではなく、パートナーの鼻を鳴らすためのものです。

あなたのパートナーはチェーンソーのように詮索し、あなたを眠らせませんか?あなたのパートナーはあなたがチェーンソーのように詮索したと主張しますが、あなたが詮索しないので彼らは彼の想像ですか?あなたのケースが何であれ、Bose(はい、ハイエンドオーディオ機器のメーカー)はあなたのために何かを持っています。それらはBoseSleepbudsと呼ばれます。

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

シーレン「Ms.JuicyBaby」ピアソンは、先月脳卒中で入院した後、「もう一度たくさんのことをする方法を学ばなければならない」ため、言語療法を受けていることを明らかにしました。

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

オスカー受賞者の世紀半ばの家には、3つのベッドルーム、2つのバス、オーシャンフロントの景色があります。

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、生後4か月の娘、モナコに母乳育児をしていると語った。

投資ノート:Bioscout AU$300万シード

投資ノート:Bioscout AU$300万シード

Bioscoutは、農家を運転席に置くという使命を負っています。Artesian(GrainInnovate)やUniseedと並んで、最新のシードラウンドでチームを支援できることをうれしく思います。問題真菌症による重大な作物の損失は、農民にとって試練であることが証明されています。

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

遠隔医療は、パンデミック後の時代では新しいものではなく、時代遅れの分野でもありません。しかし、業界を詳しく見ると、需要と供給の強力な持続可能性と、米国で絶え間ない革命となる強力な潜在的成長曲線を示しています。

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

2021年は、世界的なベンチャーキャピタル(VC)の資金調達にとって記録的な年でした。DealStreetAsiaによると、東南アジアも例外ではなく、この地域では年間で記録的な25の新しいユニコーンが採掘されました。

ムーアの法則を超えて

ムーアの法則を超えて

計算に対する私たちの欲求とムーアの法則が提供できるものとの間には、指数関数的に増大するギャップがあります。私たちの文明は計算に基づいています—建築と想像力の現在の限界を超える技術を見つけなければなりません。

Language