我如何规范化/检查json对象输出,它可以通过foreach循环(php)运行


How can I normalize/check a json object output it can run through a foreach loop (php)

也许我只是需要睡一会儿,但我想不出这个问题。我的问题是,当json输出包含单个订单与多个订单时,我有变化。

下面是一个json输出的例子:

{"Ack":"Success","OrderArray":{"Order":{"OrderID":"165921181012"}},"OrdersPerPage":"10","PageNumber":"1","ReturnedOrderCountActual":"1"}

以下是多个订单的json输出示例:

{"Ack":"Success","OrderArray":{"Order":[{"OrderID":"165921181012","OrderStatus":"Completed"},{"OrderID":"151330738592-1109250612005","OrderStatus":"Completed"},{"OrderID":"380931137567-501668037025","OrderStatus":"Completed"}]},"OrdersPerPage":"10","PageNumber":"1","ReturnedOrderCountActual":"3"}

区别在于[]

现在我的代码如下:

$json_o = json_decode($json);
foreach ($json_o->OrderArray->Order as $orderkey=>$o) { echo $o->OrderID; }

我的第一个想法是写一个if语句来处理单订单编辑**,我可以使用is_array/is_object检测单订单与多订单之间的差异。但是,是否有一种方法可以在json"OrderID"周围添加[](强制单个元素数组),以便即使只有一个订单存在,foreach循环也会运行?

如果您自己也在生成 JSON,则此时规范化格式。'Order'应该始终是一个顺序数组,即使它只包含一个元素。

如果你只使用 JSON并且没有选择:

if (!isset($json_o->OrderArray[0])) {
    $json_o->OrderArray = array($json_o->OrderArray);
}
foreach ($json_O->OrderArray as $order) ...

所以我找到了另一个处理类似问题的问题。这样你就可以自定义json编码,并在需要的地方添加括号。下面的例子在"status"元素周围添加了一个数组。

    <?php
/**
 * PHP convert XML to JSON group when there is one child
 * @link https://stackoverflow.com/q/16935560/367456
 */
$bufferXml = <<<STRING
<?xml version="1.0" encoding="UTF-8"?>
<searchResult>
    <status>
        <userName1>johndoe</userName1>
    </status>
    <users>
        <user>
            <userName>johndoe</userName>
        </user>
        <user>
            <userName>johndoe1</userName>
            <fullName>John Doe</fullName>
        </user>
        <user>
            <userName>johndoe2</userName>
        </user>
        <user>
            <userName>johndoe3</userName>
            <fullName>John Doe Mother</fullName>
        </user>
        <user>
            <userName>johndoe4</userName>
        </user>
    </users>
</searchResult>
STRING;
class XML2JsonSearchResult extends SimpleXMLElement implements JsonSerializable
{
    public function jsonSerialize()
    {
        $name = $this->getName();
        if ($name == 'status') {
            $value = (array)$this;
            return [$value];
        }
        return $this;
    }
}
$converter = new XML2JsonSearchResult($bufferXml);
echo "<pre>";
echo json_encode($converter, JSON_PRETTY_PRINT);
echo "</pre>";