PHP仅返回最后一个JSON对象


PHP Only Returning Last JSON Object

我试图做一些以前做过很多次的事情(用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),你就会明白我在说什么。