web-dev-qa-db-ja.com

json_encode / json_decode-PHPで配列の代わりにstdClassを返します

この小さなスクリプトを観察してください。

$array = array('stuff' => 'things');
print_r($array);
//prints - Array ( [stuff] => things )
$arrayEncoded = json_encode($array);
echo $arrayEncoded . "<br />";
//prints - {"stuff":"things"}
$arrayDecoded = json_decode($arrayEncoded);
print_r($arrayDecoded);
//prints - stdClass Object ( [stuff] => things )

なぜPHP JSONオブジェクトをクラスに変換するのですか?

json_encodedの配列とjson_decodedの配列は、まったく同じ結果になりませんか?

102
Derek Adair

https://secure.php.net/json_decodejson_decode($json, $assoc, $depth)の2番目のパラメーターを詳しく見てください。

139
VolkerK
$arrayDecoded = json_decode($arrayEncoded, true);

配列を提供します。

76
Kai Chan

実際の質問に答えるには:

なぜPHPはJSONオブジェクトをクラスに変換するのですか?

エンコードされたJSONの出力を詳しく見てみましょう。OPが提供している例を少し拡張しました。

_$array = array(
    'stuff' => 'things',
    'things' => array(
        'controller', 'playing card', 'newspaper', 'sand paper', 'monitor', 'tree'
    )
);
$arrayEncoded = json_encode($array);
echo $arrayEncoded;
//prints - {"stuff":"things","things":["controller","playing card","newspaper","sand paper","monitor","tree"]}
_

JSON形式はJavaScriptと同じ標準(ECMAScript Programming Language Standard)から派生したもので、形式を見るとJavaScriptのように見えます。これはJSONobject_{}_ = object)で、値が「things」のプロパティ「stuff」を持ち、プロパティ「things」を持ち、その値は文字列の配列(_[]_ = array)です。

JSON(JavaScriptとして)は連想配列をインデックス付き配列のみに認識しません。したがって、JSONがPHP連想配列をエンコードすると、 「オブジェクト」としてのこの配列。

json_decode($arrayEncoded)を使用してJSONを再度デコードしています。デコード関数は、このJSON文字列の発信元(PHP配列)を知らないため、PHPのstdClassである不明なオブジェクトにデコードしています。ご覧のとおり、文字列の「もの」配列は、インデックス付きのPHP配列にデコードされます。

参照:


https://www.randomlists.com/things に感謝します

16
7ochem

前述のとおり、ここに2番目のパラメーターを追加して、配列を返すことを示すことができます。

$array = json_decode($json, true);

多くの人は結果をキャストすることを好むかもしれません:

$array = (array)json_decode($json);

読みやすくすることができます。

4
Andrew

tl; dr:JavaScriptは連想配列をサポートしていないため、JSONもサポートしていません。

結局のところ、JSAANではなくJSONです。 :)

したがって、PHPはJSONにエンコードするために配列をオブジェクトに変換する必要があります。

2
LaVache
    var_dump(json_decode('{"0":0}'));    // output: object(0=>0)
    var_dump(json_decode('[0]'));          //output: [0]

    var_dump(json_decode('{"0":0}', true));//output: [0]
    var_dump(json_decode('[0]', true));    //output: [0]

Jsonを配列にデコードすると、この状況では情報が失われます。

1
bijiDango

また、このブログ投稿について書かれた優れたPHP 4 jsonエンコード/デコードライブラリ(つまりPHP 5逆互換))もあります: PHP4でjson_encode()およびjson_decode()を使用する(2009年6月)

具体的なコードは、Michal MigurskiとMatt Knappによるものです。

0
cwd