Я разбирал данные 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; }
Из официальной документации php: http://php.net/manual/fr/function.json-decode.php
Второй аргумент func для возврата массива. Его можно использовать, если вы предпочитаете манипулировать массивом помощников над объектом.
Но вы фактически смешиваете массив и объект в своем цикле.
Если вы держите arg в TRUE
, используйте $item['assets']['RAM']
Похоже, вы забыли добавить окружающие фигурные скобки вокруг данных 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 – это упростит их доступ к ним.
Он анализируется как объект, поэтому:
foreach ($item -> assets -> RAM as $asset){ ... }