使用PHP解析JSON数据

时间:2013-11-04 23:21:52

标签: php foreach json

我已多次解析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 个答案:

答案 0 :(得分: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循环出现问题。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

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

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

如果您将参数保持在TRUE,请使用$item['assets']['RAM']

答案 3 :(得分:0)

它被解析为一个对象,所以:

foreach ($item -> assets -> RAM as $asset){ ... }