簡體   English   中英

用PHP解析JSON數據

[英]Parse JSON Data with PHP

我已經多次解析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;
    }

好像您忘記了在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循環出現問題。

$item->assets ,而不是$item['assets'] 進行print_r($json)以便您可以看到JSON各個部分的類型-這將使它們更容易弄清楚如何訪問它們。

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

第二個func arg用於assoc數組返回。 如果您喜歡在對象上操縱assoc數組,則可以使用它。

但是實際上您在循環中混合了數組和對象。

如果將arg保持為TRUE ,請使用$item['assets']['RAM']

它被解析為一個對象,因此:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM