我能够以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
over 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
(我在想压缩,但如果 value 最终出现在 MySQL DB 缓存中,我有点不安用它)?
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"
}
}
Q3:您是否看到任何其他解决方案可以JSON
在保留原始输入的同时将关联的对象数组相互转换?