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

时间:2014-07-06 12:58:23

标签: php json

也许我只需要睡一觉,但我无法想出这个:( ...我的问题是,当它包含单个订单与多个订单时,我的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循环也会运行?

2 个答案:

答案 0 :(得分:0)

如果您自己生成 JSON,请在此时规范化格式。 'Order'应该始终是一个订单数组,即使它只包含一个元素。那,或设置一些其他标志,表示它只包含一个订单或多个订单。

如果你只是消费 JSON并且别无选择:

if (!isset($json_o->OrderArray[0])) {
    $json_o->OrderArray = array($json_o->OrderArray);
}

foreach ($json_O->OrderArray as $order) ...

答案 1 :(得分:0)

所以我发现了另一个涉及类似问题的问题。 php-convert-xml-to-json-group-when-there-is-one-child使用此功能,您可以自定义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>";