也许我只是需要睡一会儿,但我想不出这个问题。我的问题是,当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>";