Как работать с выводом JSON, который может быть массивом или значением - PullRequest
0 голосов
/ 26 апреля 2010

Я получаю вывод в кодировке JSON от API другой организации.

Во многих случаях выводом может быть либо массив объектов (если их много), либо объект (если есть только один). Сейчас я пишу измученный код так:

if ( is_array($json['candidateList']['candidate'][0]) ) {
  foreach ($json['candidateList']['candidate'] as $candidate) {
    // do something to each object
  }
}
else {
  // do something to the single object
}

Как мне справиться с этим, чтобы часть моего кода «делай что-то» появлялась только один раз и использовала стандартный синтаксис?

Ответы [ 5 ]

2 голосов
/ 26 апреля 2010

Просто сделайте его массивом, если это не так - затем продолжите итерацию.

// Normalize response into an array
if ( !is_array( $json['candidateList']['candidate'] ) )
{
  $json['candidateList']['candidate'] = array( $json['candidateList']['candidate'] );
}

// Process data
foreach ($json['candidateList']['candidate'] as $candidate) {
  // do something to each object
}
2 голосов
/ 26 апреля 2010
<?php

// When json is an object, convert to an array with a single member
if (is_object($json)) $json = array($json);

foreach ($json as $object) {
  // do something to each object
} 
2 голосов
/ 26 апреля 2010

Вы должны сказать, кто бы ни предоставлял фид, что он должен быть более последовательным :) в этом случае было бы целесообразно всегда иметь массив, даже если есть только один кандидат, поэтому у вас будет только одноэлементный массив .

1 голос
/ 26 апреля 2010

Поместите код "сделать что-то" в функцию, а затем вызовите функцию из обоих мест. У этого есть побочное преимущество модуляции вашего кода.

Кроме того, вы можете обнаружить, что у вас есть только один элемент, и построить вокруг него массив, а затем использовать код обработки массива в обоих местах.

(Примечание: я согласен с Яанусом. Правильно сформированный API вернул бы список в обоих случаях, даже если список состоит только из одного члена. Для точно по этой причине.)

0 голосов
/ 26 апреля 2010

Если вы можете изменить API, ответьте на вопрос Яануса. В противном случае, возможно, напишите функцию, которая принимает значение и возвращает либо значение (если значение является массивом), либо одноэлементный массив, содержащий значение (если это не так).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...