我试图做一些以前做过很多次的事情(用PHP访问JSON文件中的对象),但由于某种原因,json_decode
只返回JSON数组中的最后一项。这是JSON:
{
"person": {
"lname": "smith",
"fname": "bob"
},
"person": {
"lname": "jones",
"fname": "jane"
}
}
和PHP:
<?php
//access and dump
$json = file_get_contents('people.json');
$filey = json_decode($json, true);
var_dump($filey);
?>
结果只是数组中的最后一项:
array (size=1)
'person' =>
array (size=2)
'lname' => string 'jones' (length=5)
'fname' => string 'jane' (length=4)
使用json_last_error
不会返回任何错误,根据jsonint,我是有效的。加载页面时,我也没有发现任何控制台错误。
我完全被难住了,看不到任何与以前不同的东西——有人能认出我在这里错过了什么吗?
这是因为json数组中的json对象名称"person"相似,所以json解码将使用最新的值覆盖这些值。考虑类似的东西
{
"person1": {
"lname": "smith",
"fname": "bob"
},
"person2": {
"lname": "jones",
"fname": "jane"
}
}
并且您的代码将正常工作。
Marcatetura,我知道你已经接受了建议使用不同对象键的答案,但我认为你应该知道。如果你想要PHP中的数组,你甚至不需要对象名。以下JSON将起作用:
[
{
"lname": "Dawes",
"fname": "April"
},
{
"lname": "Colin",
"fname": "Dick"
}
]
当我设计JSON时,我使用的一个技巧是按照json_decode
给我的形状构建一个示例PHP数组,对该数组进行编码,并将结果输出到屏幕。所以我在上面发布的是的结果
$arr = [
['lname'=>'Dawes','fname'=>'April'],['lname'=>'Colin','fname'=>'Dick'],
];
$json = json_encode($arr);
echo $json;
由于我通过对具有我想要的形状的数组进行编码来构建JSON,所以我可以确信,即使我的数据发生了变化,json_decode($json,true)
也会为我提供我期望的数组形状。
快乐的编码。
当您使用json_decode(true)
时,您的json现在是一个数组。不能有两个相同的数组键,在本例中为"person"。
如果您仍然想使用json_decode(true)
,请将"person"更改为"person1"左右。
试试var_dump($filey)
和var_dump($json)
,你就会明白我在说什么。