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']。JSON のさまざまなprint_r($json)部分の型を確認できるようにします。これにより、それらへのアクセス方法を簡単に理解できるようになります。

于 2013-11-04T23:24:16.187 に答える
1

PHPの公式ドキュメントから: http://php.net/manual/fr/function.json-decode.php

2 番目の func 引数は、連想配列を返すためのものです。オブジェクトよりも連想配列を操作したい場合に使用できます。

しかし、実際にはループ内で配列とオブジェクトを混在させます。

引数を のままにしておく場合はTRUE、使用してください$item['assets']['RAM']

于 2013-11-05T08:48:41.960 に答える