この小さなスクリプトを観察してください。
$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
の配列は、まったく同じ結果になりませんか?
https://secure.php.net/json_decode のjson_decode($json, $assoc, $depth)
の2番目のパラメーターを詳しく見てください。
$arrayDecoded = json_decode($arrayEncoded, true);
配列を提供します。
なぜ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配列にデコードされます。
参照:
前述のとおり、ここに2番目のパラメーターを追加して、配列を返すことを示すことができます。
$array = json_decode($json, true);
多くの人は結果をキャストすることを好むかもしれません:
$array = (array)json_decode($json);
読みやすくすることができます。
tl; dr:JavaScriptは連想配列をサポートしていないため、JSONもサポートしていません。
結局のところ、JSAANではなくJSONです。 :)
したがって、PHPはJSONにエンコードするために配列をオブジェクトに変換する必要があります。
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を配列にデコードすると、この状況では情報が失われます。
また、このブログ投稿について書かれた優れたPHP 4 jsonエンコード/デコードライブラリ(つまりPHP 5逆互換))もあります: PHP4でjson_encode()およびjson_decode()を使用する(2009年6月) 。
具体的なコードは、Michal MigurskiとMatt Knappによるものです。