我能够以解码值与原始输入匹配的方式对索引数组进行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:你确认了吗?
可能的解决方案
序列化/反序列化:
绝对想要在序列化/反序列化中使用json_encode / json_decode的原因是编码形式更加简洁,这很重要,因为它最终存储在缓存中并且缓存空间有限:
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:您是否曾经遇到过使用序列化的缓存空间问题,如果是这样,您是如何处理除了使用json_encode之外的其他问题(我正在考虑压缩,但如果值最终会在MySQL数据库缓存中结束,那么我就是有点不安吗)?
json_decode($JSON,真):
问题是应该保留对象的嵌套对象也会转换为数组:
$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) {
["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"
}
}
问题3:您是否看到任何其他解决方案将关联对象数组转换为JSON并返回,同时保留原始输入?
解决方法:
由于无法在json中编写关联数组,因此它将被编写为对象,因此PHP会在解码时将其作为对象进行处理.
json_decode($json, true)
^^^^
标签:php,json,object,serialization,associative-array
来源: https://codeday.me/bug/20190826/1725972.html