gpt4 book ai didi

php - 关联 PHP 数组(包含对象)的非破坏性 JSON 编码/解码

转载 作者:可可西里 更新时间:2023-11-01 00:34:20 24 4
gpt4 key购买 nike

我能够以解码值与原始输入匹配的方式对索引数组进行 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 而不是 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;}

问题 2:您是否遇到过使用 serialize 时遇到的缓存空间问题,如果遇到过,除了使用 json_encode(我'我在考虑压缩,但如果值最终出现在 MySQL 数据库缓存中,我对此有点不安)?

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"
}
}

问题 3:您是否看到任何其他解决方案可以在保留原始输入的同时将关联的对象数组转换为 JSON 并返回?

最佳答案

由于json中不可能写关联数组,所以会写成一个对象,这样PHP在解码的时候会把它当作一个对象来读取。

为了使 PHP 将其作为数组读取,您必须 set the second parameter of json_decode to true :

json_decode($json, true)
^^^^

关于php - 关联 PHP 数组(包含对象)的非破坏性 JSON 编码/解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13027796/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com