JSON
デコードされた値が元の入力と一致するように、インデックス付き配列をエンコードおよびデコードできます。
$array_indexed = ['A'];
$encoded = json_encode($array_indexed);
$decoded = json_decode($encoded);
var_dump($array_indexed);
array(1) {
[0]=>
string(1) "A"
}
var_dump($decoded);
array(1) {
[0]=>
string(1) "A"
}
ただし、関連付けられた配列をエンコードすると、最終的にオブジェクトになります。
$array_associate = [ 'FOO' => 'BAR'];
$encoded = json_encode($array_associate);
$decoded = json_decode($encoded);
var_dump($array_associate);
array(1) {
["FOO"]=>
string(3) "BAR"
}
var_dump($decoded);
object(stdClass)#1 (1) {
["FOO"]=>
string(3) "BAR"
}
私の理解では、Javascript
オブジェクトを使用して代わりに表される関連配列をサポートしていないため、これは通常の動作であり、したがって、関連配列をエンコードすると、オブジェクトとしてエンコードされます (したがって、そのようにデコードされます)。
Q1: 確認できますか?
可能な解決策
serialize
/ unserialize
:絶対に/で/
を使用したい理由は、エンコードされた形式がはるかに簡潔であるためです。これは、最終的にキャッシュに格納され、キャッシュ スペースが限られているため重要です。json_encode
json_decode
serialize
unserialize
var_dump(json_encode(['A'=>1,'B'=>2])); // string(13) "{"A":1,"B":2}"
var_dump(serialize(['A'=>1,'B'=>2])); // string(30) "a:2:{s:1:"A";i:1;s:1:"B";i:2;}
Q2: を使用してキャッシュ スペースの問題に直面しserialize
たことがありますか? もしそうなら、使用する以外にどのように対処しましたかjson_encode
?それと)?
json_decode($json,true)
:
問題は、オブジェクトのままであるべきネストされたオブジェクトも配列に変換されることです。
$obj = new stdClass;
$obj->foo = 'bar';
$array_associate = [ 'A' => $obj];
$encoded = json_encode($array_associate);
var_dump(json_decode($encoded,true));
array(1) {
["A"]=>
array(1) { <---------------- NO LONGER AN OBJECT, DON'T WANT THAT
["foo"]=>
string(3) "bar"
}
}
オブジェクトのオブジェクトをオブジェクトの配列に変換します。
引き続き上記の例に基づいて
$object_of_objects = json_decode($encoded);
$array = [];
foreach($object_of_objects as $key=>$object) {
$array[$key] = $object;
}
var_dump($array);
array(1) {
["A"]=>
object(stdClass)#6 (1) {
["foo"]=>
string(3) "bar"
}
}
JSON
Q3:元の入力を保持しながら、オブジェクトの関連配列を相互に変換する他のソリューションはありますか?