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


214

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

私はJSONを持っています:

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

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


1
関連:print_r()の出力で変数を確認することはできますが、コード変数にアクセスする方法がわからない場合、PHPのコンテキストでインタラクティブなJSON探索がここで可能です:array.include-once.org
hakre

stackoverflow.com/questions/4343596/parsing-json-file-with-phpの重複としてマークされた9人以下のユーザーでも、この質問が重複質問と見なされないのはなぜですか?M
私は最も愚かな人です

@IamtheMostStupidPersonあなたのユーザー名が私にあなたがそれを得るかどうか疑わしいとしても、私は説明しようとします;)。この質問は尋ねられ、その答えは「標準的な」方法で書かれています。そのため、他の質問よりも重複したターゲットのより良い受信者です。
フェリックス・ガニオン-グルニエ

回答:


428

はじめに

まず、あなたはひもを持っています。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

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」の値は「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

これは、次のいずれかの理由で発生します。

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


この答えに出くわしただけで、array.include-once.orgへのリンクが壊れていることがわかりました。
Jeff

@ジェフありがとう。そのことは残念です。リンクを削除しました。
user3942918 2017

ええ、リンクの名前とあなたがそれをどう説明したかを考えると、それは本当のつまらないもののように聞こえます。
ジェフ

このソリューションに欠けているのは、別のjsonファイルからデータを抽出する方法だけでした。私は、このsolutuonをお勧めします:stackoverflow.com/questions/19758954/...
イシャンSrivastava氏

これは素晴らしい。ありがとうございました。
David Kariuki

17

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値が返されるだけです。

それでも、彼らはその単純さを好まなかったかもしれません。いつでも賛成投票できます;)
Mohd Abdul Mujib

1
おそらくより可能性の高い理由は、それがすでに回答されており、@ MohdAbdulMujibが無料の担当者の後であるようです
Isaac

3
@Isaac一部の人々は、関数の使用を開始したいだけのときに、マニュアル全体を読むことにあまり熱心でない場合があります。そうでなければ、彼らは公式のドキュメントを読む方が良いでしょう。SOの全体のポイントは、答えが提供されるシンプルさです。IMHO
Mohd Abdul Mujib 2017年

3
// 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

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


-1

JSONGitHubPackagist)というパッケージを作成しました。json_*関数の使用によるオーバーヘッドを防ぎたい場合は、それを試してみてください。

use MAChitgarha\Component\JSON;

$jsonStr = <<<JSON
{
    "type": "donut",
    "name": "Cake",
    "toppings": [
        { "id": "5002", "type": "Glazed" },
        { "id": "5006", "type": "Chocolate with Sprinkles" },
        { "id": "5004", "type": "Maple" }
    ]
}
JSON;

// Create an instance
$json = new JSON($jsonStr);

// Get a nested element using dots
$json->get("toppings.1.type"); // Chocolate with Sprinkles
$json["toppings.1.type"]; // Chocolate with Sprinkles

// Iterate over an element
foreach ($json->iterate("toppings") as $item)
    echo "{$item->id}: {$item->type}", PHP_EOL;

// Change an element
$json->set("toppings.3", [
    "id" => "5000",
    "type" => "Unknown"
]);

// Get data as JSON string, array or object, respectively
$json->getDataAsJson();
$json->getDataAsArray();
$json->getDataAsObject();

Wikiを参照する、クイックチュートリアルを参照してください。

さらに、JSONファイルを読み取ってそのデータを抽出する場合(これを実行しようとしているように思われる場合)は、私が作成したJSONFileパッケージも参照してください。


-2

https://paiza.io/projects/X1QjjBkA8mDo6oVh-J_63w

jsonをで配列に変換するための以下のコードを確認してくださいPHP。JSONが正しい場合は適切にjson_decode()機能し、配列を返しますが、不正な形式のJSONの場合はを返しますNULL

<?php
function jsonDecode1($json){
    $arr = json_decode($json, true);
    return $arr;
}

// In case of malformed JSON, it will return NULL
var_dump( jsonDecode1($json) );

JSONの形式が正しくなく、配列のみが必要な場合は、この関数を使用できます。

<?php
function jsonDecode2($json){
    $arr = (array) json_decode($json, true);
    return $arr;
}

// In case of malformed JSON, it will return an empty array()
var_dump( jsonDecode2($json) );

JSONの形式が正しくなく、コードの実行を停止したい場合は、この関数を使用できます。

<?php
function jsonDecode3($json){
    $arr = (array) json_decode($json, true);

    if(empty(json_last_error())){
        return $arr;
    }
    else{
        throw new ErrorException( json_last_error_msg() );
    }
}

// In case of malformed JSON, Fatal error will be generated
var_dump( jsonDecode3($json) );

要件に応じて任意の関数を使用できますが、

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.