加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – JSON对象转换问题

发布时间:2020-12-13 16:38:09 所属栏目:PHP教程 来源:网络整理
导读:我正在从 JSON转换为对象,从对象转换为数组.这不是我预期的,你可以向我解释吗? $json = '{"0" : "a"}';$obj = json_decode($json);$a = (array) $obj;print_r($a);echo("a0:".$a["0"]."br");$b = array("0" = "b");print_r($b);echo("b0:".$b["0"]."br");
我正在从 JSON转换为对象,从对象转换为数组.这不是我预期的,你可以向我解释吗?
$json = '{"0" : "a"}';
$obj = json_decode($json);
$a = (array) $obj;
print_r($a);
echo("a0:".$a["0"]."<br>");

$b = array("0" => "b");
print_r($b);
echo("b0:".$b["0"]."<br>");

这里的输出是:

Array ( [0] => a ) a0:
Array ( [0] => b ) b0:b

我会期待a0:a在第一行的结尾.

编辑:阅读答案后,我扩展了代码,这使得行为更加清晰:

//extended example
$json = '{"0" : "a"}';
$obj = json_decode($json);
$a = (array) $obj;
var_export($a);
echo("a0:".$a["0"]."<br>"); //this line does not work,see the answers
echo $obj->{"0"}."<br>";  //works!

$json = '{"x" : "b"}';
$obj = json_decode($json);
$b = (array) $obj;
var_export($b);
echo("bx:".$b["x"]."<br>");

$c = array("1" => "c");
var_export($c);
echo("c1:".$c["1"]."<br>");

$d = array("0" => "d");
var_export($d);
echo("d0:".$d["0"]."<br>");

输出扩展示例:

array ( '0' => 'a',)a0:
a
array ( 'x' => 'b',)bx:b
array ( 1 => 'c',)c1:c
array ( 0 => 'd',)d0:d
this older question中有更多的信息.简短的版本是,PHP对象/类上的 properties遵循相同的 naming convention as variables.对于PHP对象,数值属性无效,因此在从另一种语言序列化对象时应该发生什么,json / javascript)具有数字键.尽管上述情况似乎是显而易见的,但有不同偏见的人则认为PHP在这种情况下的行为是完全有效和优先的.

所以,这是一个错误,但更多的是一个未定义的规范区域,没有明确的答案,所以不要指望行为改变以满足你的喜好,如果它改变,不要指望这个变化是永久的.

为了解决评论中的一些问题,请考虑这一点

header('Content-Type: text/plain');
$json = '{"0" : "a"}';
$obj = json_decode($json);
$a = (array) $obj;
var_dump($a);
var_dump(array(0=>'a'));
var_dump(array('0'=>'a'));

那会输出这样的东西

array(1) {
  ["0"]=>
  string(1) "a"
}
array(1) {
  [0]=>
  string(1) "a"
}
array(1) {
  [0]=>
  string(1) "a"
}

具有单个字符串键值的数组不是有效的PHP构造.如果您尝试创建一个PHP,则会将零转换为int.当你要求PHP做一个转换时,它没有一个定义,它最终创建一个带有字符串键的数组(因为这里应该发生什么不正确的规则).

虽然这是显而易见的,这是PHP的“错误”行为,在弱类型语言中定义正确的行为并不容易.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读