json_decodeを配列に


422

JSON文字列を配列にデコードしようとしていますが、次のエラーが発生します。

致命的なエラー:6行目のC:\ wamp \ www \ temp \ asklaila.phpの配列としてstdClassタイプのオブジェクトを使用できません

これがコードです:

<?php
$json_string = 'http://www.domain.com/jsondata.json';

$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata);
print_r($obj['Result']);
?>

1
$ob->Result代わりにでアクセスすればうまくいきました。
lapin

回答:


839

ドキュメントに従ってからのオブジェクトの代わりに連想配列が必要かどうかを指定する必要がありますjson_decode。これはコードです。

json_decode($jsondata, true);

4
オブジェクトではなく配列として返すことの利点は何ですか?
Foxinni 2012

52
それは問題を提起します。「質問をする」とは、まだ証明されていない何かを仮定することを意味します(参照)。どちらの場合も、利点は、OPがオブジェクトよりも配列をトラバースしやすいこと、またはすでに実装されている他のコードが配列を必要とすることです。
jamesnotjim

8
@jamesnotjimオブジェクトを返すデフォルトの実装では、オブジェクトは配列よりも戻り値が優れているという疑問を抱く可能性がありますか?
David Mann

7
確かにそれは@DavidMannでした。Touché!
jamesnotjim 2013年

8
JSONにはデータ以外のものが含まれる可能性はないというコメントを(数年後ではありますが)追加します。
バリー

45

これを試して

$json_string = 'http://www.domain.com/jsondata.json';
$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata,true);
echo "<pre>";
print_r($obj);

27

これは後半の貢献ですが、キャストのために有効な場合があるjson_decodeとは(array)
以下を検討してください。

$jsondata = '';
$arr = json_decode($jsondata, true);
foreach ($arr as $k=>$v){
    echo $v; // etc.
}

$jsondataが空の文字列として返される場合(私の経験では頻繁にそうなります)はjson_decodeを返しNULL、エラー警告:行3のforeach()に指定された引数が無効です。if / thenコードの行または3項演算子を追加することもできますが、IMOの2行目を...

$arr = (array) json_decode($jsondata,true);

... json_decode一度に数百万の大きな配列を使用しない限り、@ TCB13が指摘するように、パフォーマンスに悪影響を及ぼす可能性があります。



6

PHPドキュメントに よると、json_decode関数にはassocという名前のパラメータがあり、返されたオブジェクトを連想配列に変換します

 mixed json_decode ( string $json [, bool $assoc = FALSE ] )

以来連想パラメータがありFALSE、デフォルトでは、あなたは、この値を設定する必要がありTRUE、配列を取得するために。

影響の例については、以下のコードを調べてください。

$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)
}

5

これにより、配列に変更されます。

<?php
    print_r((array) json_decode($object));
?>

6
これはCPU /メモリの浪費です。提案されjson_decode($object, true);trueいるように、内部的にははるかに高速ですが、まったく同じです。
TCB13 2013

1
あなたは両方を必要として再度デコードを実行しない場合を除き、TCB13 @
ジミーケイン

3
@JimmyKaneに同意します。私は両方のバージョンをサイクルで試して実行しました。オブジェクトと配列の両方が必要な場合(これはめったに起こらないはずですが?)、json_decode+キャストはの両方のフレーバーを実行するよりも45%高速ですjson_decode。一方、どちらも非常に高速であるため、文字通り数千回のデコードが必要でない限り、その違いはごくわずかです。
LSerni

4

json_decode2番目の引数をサポートします。これに設定するTRUEと、Arrayではなくが返されstdClass Objectます。関数のマニュアルページをチェックしてjson_decode、サポートされているすべての引数とその詳細を確認してください。

たとえば、これを試してください:

$json_string = 'http://www.example.com/jsondata.json';
$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata, TRUE); // Set second argument as TRUE
print_r($obj['Result']); // Now this will works!

3
json_decode($data, true); // Returns data in array format 

json_decode($data); // Returns collections 

したがって、配列が必要な場合は、2番目の引数をjson_decode関数で「true」として渡すことができます。


3

これがお役に立てば幸いです

$json_ps = '{"courseList":[  
            {"course":"1", "course_data1":"Computer Systems(Networks)"},  
            {"course":"2", "course_data2":"Audio and Music Technology"},  
            {"course":"3", "course_data3":"MBA Digital Marketing"}  
        ]}';

Jsonデコード関数を使用する

$json_pss = json_decode($json_ps, true);

PHPでのJSON配列のループ

foreach($json_pss['courseList'] as $pss_json)
{

    echo '<br>' .$course_data1 = $pss_json['course_data1']; exit; 

}

結果:計算機システム(ネットワーク)


2

PHP json_decodeで、jsonデータをPHPに関連付けられた配列に変換します
Exの場合:$php-array= json_decode($json-data, true); print_r($php-array);


2

これをお試しください

<?php
$json_string = 'http://www.domain.com/jsondata.json';

$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata, true);
echo "<pre>"; print_r($obj['Result']);
?>

2

このようにしてみてください:

$json_string = 'https://example.com/jsondata.json';
$jsondata = file_get_contents($json_string);
$obj = json_decode($jsondata);
print_r($obj->Result);
foreach($obj->Result as $value){
  echo $value->id; //change accordingly
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.