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