我已多次解析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;
}
答案 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){ ... }