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


108

次の小さなスクリプトを確認してください。

$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まったく同じ結果が得?

回答:


145

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


7
質問には答えません-なぜstdClassがデフォルトなのですか?stackoverflow.com/questions/3193765/…
William Entriken

7
これは実際には質問の答えにはならず、回避策を提供するだけです。しかし、ひどい回避策、IMO。jsonエンコードされたオブジェクトをオブジェクトとしてデコードし、jsonデコードされた連想配列を連想配列として自動的にデコードしたい場合はどうなりますか?json_decode()に2番目のパラメーターを使用することは、ある種の人間の介入を意味します。率直に言って、これは(PHPの、この答えではなく)
JDS '

@JDSを使用すると、これらの関数を非常に簡単にラップして、必要に応じてソースタイプをjsonキーに透過的に格納する独自の関数を作成できます。
sivann 2014年

2
@JDS「PHPがJSONオブジェクトをクラスに変換する理由」の質問に実際に答える回答を追加しました。
7ochem

82
$arrayDecoded = json_decode($arrayEncoded, true);

配列を与えます。


2
これはとても役に立っています。ありがとう@Kaiチェーン-元の質問は「なぜ」と尋ねていたと思いますが、これは彼らが意図したものに到達したようです。いずれにせよ、私の状況に最適です。
ghukill

そして、ここで4年後も同じ仕事をします!私のように、誰もが最初に実際に勉強すべき基本知識!
KJS 2019年

20

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

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プログラミング言語標準)から派生したものであり、形式を見るとJavaScriptのように見えます。これは、「things」という値を持つ「stuff」というプロパティを持つJSON オブジェクト{}=オブジェクト)であり、その値が文字列の配列である「things」というプロパティを持つ([]= array)。

JSON(JavaScriptとして)では、連想配列はインデックス付き配列のみを認識しません。そのため、PHPの連想配列をJSONエンコードすると、この配列を「オブジェクト」として含むJSON文字列が生成されます。

次に、を使用してJSONを再度デコードしますjson_decode($arrayEncoded)。デコード関数は、このJSON文字列がどこから発生したか(PHP配列)を認識していないため、PHP内の不明なオブジェクトにデコードしていますstdClass。ご覧のとおり、文字列の "things"配列はインデックス付きのPHP配列にデコードされます。

こちらもご覧ください:


「もの」のためのhttps://www.randomlists.com/thingsに感謝


2
これが正解です...それは質問に答えますが、他の問題は説明できない問題に回避策を提供します。おかげで、JSONが連想配列をサポートしていないことを忘れていました!
marcus

5

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

$array = json_decode($json, true);

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

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

読みやすくなります。


4
違いがある。多次元配列またはオブジェクトをエンコードしたかどうかに注意してください。1つ目は配列の配列、2つ目はオブジェクトの配列です。
Hector

2

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

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

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


1
    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を配列にデコードすると、この状況では情報が失われます。


0

また、このブログ投稿に書かれている、PHP 4 jsonエンコード/デコードライブラリ(PHP 5のリバース互換でさえあります)も用意されています。

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

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