假设我从API获取了json以下的响应。
{
"owner": "Jane Doe",
"pets": [
{
"color": "white",
"type": "cat"
},
{
"color": "black",
"type": "dog"
}
]
}
从下面的PHP代码我已经将json字符串转换为json对象。并显示宠物类型。
$jsonObject = json_decode($json);
foreach($jsonObject->pets as $pets){
echo 'Pet type:'.$pets->type.'</br>';
}
但是在某些情况下,来自API的响应json采用以下格式
{
"owner": "John Doe",
"pets": {
"color": "white",
"type": "cat"
}
}
在这种情况下,上面的php foreach迭代失败并显示以下消息
*注意:尝试获取非对象的属性*
我正在寻找一种简单的方法来实现这一点,因为我正在处理的实际json响应中有很多这样的事件。
答案 0 :(得分:7)
您需要检查$jsonObject->pets
是否为数组或对象。如果它是一个对象,将其替换为包含该对象的数组,那么循环将起作用。
if (!is_array($jsonObject->pets)) {
$jsonObject->pets = array($jsonObject->pets);
}
你也可以在foreach
:
foreach (is_array($jsonObject->pets) ? $jsonObject->pets : [jsonObject->pets] as $pet) {
...
}
如果你不想每次都写这些,你可以把它放在一个函数中:
function as_array($x) {
return is_array($x) ? $x : [x];
}
然后使用:
foreach (as_array($jsonObject->pets) as $pet) {
...
}
我也向API设计师抱怨。返回不一致的数据格式是荒谬的。