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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值