php foreach通过json迭代

Aro*_*lva -1 php foreach json

假设我从API获取了json以下的响应.

{
    "owner": "Jane Doe",
    "pets": [
        {
            "color": "white",
            "type": "cat"
        },
        {
            "color": "black",
            "type": "dog"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

从下面的PHP代码我已经将json字符串转换为json对象.并显示宠物类型.

$jsonObject = json_decode($json);

foreach($jsonObject->pets as $pets){
    echo 'Pet type:'.$pets->type.'</br>';
}
Run Code Online (Sandbox Code Playgroud)

但是在某些情况下,来自API的响应json采用以下格式

{
    "owner": "John Doe",
    "pets": {
        "color": "white",
        "type": "cat"
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,上面的php foreach迭代失败,下面的消息

*注意:试图获得非对象的属性*

我正在寻找一种简单的方法来实现这一点,因为我正在处理的实际json响应中有很多这样的事件.

Bar*_*mar 7

您需要检查$jsonObject->pets是数组还是对象.如果它是一个对象,将其替换为包含该对象的数组,那么循环将起作用.

if (!is_array($jsonObject->pets)) {
    $jsonObject->pets = array($jsonObject->pets);
}
Run Code Online (Sandbox Code Playgroud)

您也可以在以下条件中使用条件foreach:

foreach (is_array($jsonObject->pets) ? $jsonObject->pets : [jsonObject->pets] as $pet) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果你不想每次都写这些,你可以把它放在一个函数中:

function as_array($x) {
    return is_array($x) ? $x : [x];
}
Run Code Online (Sandbox Code Playgroud)

然后使用:

foreach (as_array($jsonObject->pets) as $pet) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

我也向API设计师抱怨.返回像这样的不一致数据格式是荒谬的.