如何解码多层嵌套的JSON字符串并在PHP中显示?

时间:2017-06-01 17:11:03

标签: php json

我知道如何解码JSON字符串并从一维数组中获取数据但是如何从嵌套数组中获取数据? 以下是我的代码:

$data = json_decode($json);

及以下是JSON返回值:

{
      "area_metadata": [
        {
          "name": "A",
          "label_location": {
            "latitude": 1,
            "longitude": 1
          }
        },
        {
          "name": "B",
          "label_location": {
            "latitude": 1,
            "longitude": 1
          }
        }   
      ],
     "items": [
            {
              "update_timestamp": "2017-05-02T09:51:20+08:00",
              "timestamp": "2017-05-02T09:31:00+08:00",
              },
              "locations": [
                {
                  "area": "A",
                  "weather": "Showers"
                },
                {
                  "area": "B",
                  "weather": "Cloudy"
                }
              ]
            }
        ]}

我测试过:

echo $data->items->locations[0]->area;

但是我收到了这个错误

Trying to get property of non-object

另外,我尝试将JSON转换为数组而不是对象:

$data = json_decode($json,true);


if (isset($data)) 
{
    foreach ($data->items->locations as $location) 
    {
            if (empty($location["area"])) { continue; }
            if ($location["area"] == "A") 
            {
                echo $location["weather"];

            }


    }
}

但它也无效。

任何人都可以建议我做错了哪一步吗? 谢谢!

编辑: 下面是具有完整JSON内容的pastebin链接。 https://pastebin.com/cewszSZD

2 个答案:

答案 0 :(得分:1)

您提供的JSON(在您的问题中)格式不正确,并在其上使用json_decode()将导致NULL。因此,当您尝试访问已解码的对象时,不会发生任何事情,因为它不存在。

您提供的完整JSON是有效的,并且您的代码未产生任何结果的原因是因为在items中存在“内部” - 阵列:

(...) 
["items"] => array(1) {
    [0] => array(4) {
//  ^^^^^^^^^^^^^^^^^
        ["update_timestamp"] => string(25) "2017-05-02T09:21:18+08:00" 
        ["timestamp"] => string(25) "2017-05-02T09:07:00+08:00" 
        ["valid_period"] => array(2) { 
            ["start"] => string(25) "2017-05-02T09:00:00+08:00" 
            ["end"] => string(25) "2017-05-02T11:00:00+08:00" 
        } 
        ["forecasts"] => array(47) { 
            [0] => array(2) { 
                ["area"] => string(10) "Ang Mo Kio" 
                ["forecast"] => string(19) "Partly Cloudy (Day)" 
            }
            (...)

您必须通过键0访问该数组,对于数组,它将如下所示:

$data = json_decode($json, true);
echo $data['items'][0]['forecasts'][0]['area'];
//                 ^^^

对于像这样的对象:

$data = json_decode($json);
echo $data->items[0]->forecasts[0]->area;
//               ^^^

第二个0更改位置(forecasts数组中的不同数组)。

您可以检查输出here(数组方法)和here(对象方法)。

答案 1 :(得分:0)

如果您发布所有JSON数据或链接到它的屏幕截图,将会更容易提供帮助。试试:

$items[0]['locations'][0]['area'];

字符串上的单引号,数字上没有引号。