1

我已经多次解析 JSON 数据,但由于某种原因无法找到嵌套数据时使用的正确语法。我正在尝试从此 JSON 解析“资产”,但无论我尝试什么,都会继续获得提供的无效参数 foreach()。

   "3435":{
      "name":"COLO-1014-SJ1",
      "nickname":"US-SJC-004",
      "type":"Colocated Server",
      "location":"San Jose:55 S Market",
      "assets":{
         "CPU":[
            {
               "model":"Intel E3 1270"
            }
         ],
         "Hard Drives":[
            {
               "model":"Western Digital 500GB RE4 ABYX SATA"
            },
            {
               "model":"Western Digital 500GB RE4 ABYX SATA"
            },
            {
               "model":"Kingston 240GB SSD"
            }
         ],
         "RAM":[
            {
               "model":"Super Talent 4GB DDR3 1333 ECC"
            },
            {
               "model":"Super Talent 4GB DDR3 1333 ECC"
            },
            {
               "model":"Super Talent 4GB DDR3 1333 ECC"
            },
            {
               "model":"Super Talent 4GB DDR3 1333 ECC"
            }
         ],

我希望它会类似于...

$json = json_decode($jsondata, true);

foreach ($json as $item)
{
    foreach ($item['assets']->RAM as $asset)
    {
        echo $asset->model;
    }
4

4 回答 4

4

您似乎忘记在 JSON 数据周围添加花括号。如果您的 JSON 数据无效,则 json_decode() 函数将无法正常工作。

我在下面修复了您的 JSON 代码,现在验证并符合 JSON 标准。

{
    "3435": {
        "name": "COLO-1014-SJ1",
        "nickname": "US-SJC-004",
        "type": "Colocated Server",
        "location": "San Jose:55 S Market",
        "assets": {
            "CPU": [
                {
                    "model": "Intel E3 1270"
                }
            ],
            "Hard Drives": [
                {
                    "model": "Western Digital 500GB RE4 ABYX SATA"
                },
                {
                    "model": "Western Digital 500GB RE4 ABYX SATA"
                },
                {
                    "model": "Kingston 240GB SSD"
                }
            ],
            "RAM": [
                {
                    "model": "Super Talent 4GB DDR3 1333 ECC"
                },
                {
                    "model": "Super Talent 4GB DDR3 1333 ECC"
                },
                {
                    "model": "Super Talent 4GB DDR3 1333 ECC"
                },
                {
                    "model": "Super Talent 4GB DDR3 1333 ECC"
                }
            ]
        }
    }
}

如果您需要检查您的 JSON 代码,您可以使用验证器,例如http://jsonlint.com/

其次,你的 PHP 代码也是错误的:

$json = json_decode($jsondata, true);

foreach ($json as $item)
{
    foreach ($item->assets->RAM as $asset)
    {
        echo $asset->model;
    }
}

您一直在尝试将返回的对象作为数组访问,这也会导致 foreach 循环出现问题。

于 2013-11-04T23:26:57.500 回答
2

$item->assets,不是$item['assets']。这样做print_r($json)你可以看到 JSON 的各个部分的类型 - 这将使它们更容易弄清楚如何访问它们。

于 2013-11-04T23:24:16.187 回答
1

来自php官方文档: http: //php.net/manual/fr/function.json-decode.php

第二个 func arg 用于 assoc 数组返回。如果您更喜欢在对象上操作 assoc 数组,则可以使用它。

但是您实际上在循环中混合了数组和对象。

如果您保持 arg 为TRUE,请使用$item['assets']['RAM']

于 2013-11-05T08:48:41.960 回答
0

它被解析为一个对象,因此:

foreach ($item -> assets -> RAM as $asset){ ... }
于 2013-11-04T23:24:36.220 回答