2

我正在从一个以相当直接的结构返回 JSON 数据的 API 进行响应。伪结构最好表示为:

services -> service -> options -> option -> suboptions -> option

由于这是解码的 JSON,所有这些都是 stdClass 对象。我有许多 foreach 语句遍历各种服务和选项,它们都可以正常工作。但是,当我在子选项级别使用 foreach 语句时,对象被序列化为字符串。供您参考,子选项具有这样的结构。

[suboptions] => stdClass Object
 (
    [option] => stdClass Object
        (
            [code] => SOME_CODE
            [name] => Some Name
        )

 )

当使用这样的 foreach 时(其中 $option 是services -> service -> options -> option中的一个选项):

foreach($option->suboptions->option as $suboption) {
  print_r($suboption);
}

它输出

SOME_CODESome Name

不是预期的

stdClass Object
  (
     [code] => SOME_CODE
     [name] => Some Name
  )

我不知道任何原因 foreach 会在深度或其他条件方面这样做。我已经尝试了我能想到的一切并通过 SO 进行搜索,但找不到任何发生这种情况的案例。如果有人有任何想法,我很想听听他们的意见!干杯。

抱歉,如果它已在其他地方得到回答,或者我遗漏了一些明显的东西。如果我有,到目前为止它已经逃脱了我。

编辑:对于那些要求它确实是 AusPost PAC API 的人。2014 年左右从刚果民主共和国移除。

4

3 回答 3

1

I can't comment, because I don't have that amount of reputation, but I'll try to answer...

I'm assuming you want to remove the stdClass from the PHP array?

If so, then make sure you are using true when decoding the JSON.

Example: $array = json_decode($json, true);

For more information on stdClass, see this SO post: What is stdClass in PHP?

Again, forgive me if I'm misinterpreting your question, I just wish I could comment...

于 2013-10-07T02:27:57.733 回答
0

我假设这是来自澳大利亚邮政邮资计算 API的回复。这个 API 做出了一个可怕的决定,将只有一个项目的集合实例视为单个值。例如,service -> options -> option可能是一个数组,也可能是一个选项

我发现处理此问题的最简单方法是将其option转换为数组,例如

$options = $service->options->option;
if (!is_array($options)) {
    $options = array($options);
}

// now you can loop over it safely
foreach ($options as $option) { ... }

你会对子选项做同样的事情。如果您有兴趣,我有一个处理 AusPost API 的完整库,使用Guzzle来管理 HTTP 端。

于 2013-10-07T03:47:01.087 回答
0

最后一个对象的值不是数组,因此您需要键和值。

foreach($option->suboptions->option as $key => $value) {
  echo '<p>KEY:'.$key.' VALUE:'.$value.'</p>';
}
于 2013-10-07T03:33:18.637 回答