Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.5k views
in Technique[技术] by (71.8m points)

foreach - Parse JSON Data with PHP

I have parsed JSON data numerous times but for some reason cannot find the correct syntax to use when the data is nested. I am trying to parse the "assets" from this JSON but continue to get a invalid argument supplied foreach() regardless of what I try.

   "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"
            }
         ],

I would expect it to be something along the lines of...

$json = json_decode($jsondata, true);

foreach ($json as $item)
{
    foreach ($item['assets']->RAM as $asset)
    {
        echo $asset->model;
    }
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

It looks like you have forgot to add the surrounding curly braces around the JSON data. If your JSON data is invalid then the json_decode() function will not work correctly.

I have fixed your JSON code below and this now validates and meets the JSON standard.

{
    "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"
                }
            ]
        }
    }
}

If you ever need to check your JSON code you can use a validator such as http://jsonlint.com/

Secondly, your PHP code is also wrong:

$json = json_decode($jsondata, true);

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

You have been trying to access the returned object as an array which will also cause issues with the foreach loop.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...