Как я должен обрабатывать ключ, который может иметь значение объекта или массива?

#php #json #parsing

#php #json #синтаксический анализ

Вопрос:

В настоящее время у меня есть некоторый код, который использует некоторый JSON с сайта. Это в основном то, что я сейчас делаю

 $valueObject = array();
if (isset($decoded_json->NewDataSet)) {
             foreach ($decoded_json->NewDataSet->Deeper as $state) {
                 $i = count($valueObject);
                 $valueObject[$i] = new ValueObject();
                 $valueObject[$i]->a = $state->a;
}
  

Теперь проблема возникает, когда есть только один «Более глубокий». Сервер возвращает его как объект JSON. Затем $ state становится каждым ключом в более глубоком объекте. $ state-> a не будет существовать, например, до позиции 7. Есть ли какой-либо способ, которым я мог бы преобразовать Deeper из объекта JSON в массив, когда количество deeper равно единице?

Надеюсь, это поможет проиллюстрировать мою проблему:

 "NewDataSet": {
        "Deeper": [
            {
                "a": "112",
                "b": "1841"
            },
            {
                "a": "111",
                "b": "1141"
            }
        ]
    }
}
  

против

 "NewDataSet": {
        "Deeper":
            {
                "a": "51",
                "b": "12"
            }
}
  

преобразование выше в

 "NewDataSet": {
      "Deeper": [
           {
               "a": "51",
               "b": "12"
           }
       ]
}
  

было бы здорово. Я не знаю, как это сделать

Комментарии:

1. возможно, я думаю, что здесь все просто, но почему бы не выполнить преобразование в array? В противном случае просто проверьте, является ли это объектом или массивом

2. @Hannes: Когда count () возвращает единицу, я хотел бы преобразовать ее в массив. Это то, что я ищу, я не знаю, как это сделать. count($json-> NewDataSet-> Deeper) == 1 означает объект. Проблема в том, что когда я заполняю объект со значением 30 полей, я не хочу его копировать.

Ответ №1:

Перед

foreach ($decoded_json->NewDataSet->Deeper as $state)

вы, вероятно, хотите:

 if (is_array($decoded_json->NewDataSet)) {
    // This is when Deeper is a JSON array.
    foreach ($decoded_json->NewDataSet->Deeper as $state) {
        // ...
    }
} else {
    // This is when Deeper is a JSON object.
}
  

Обновить
Если вы просто хотите преобразовать $decoded_json->NewDataSet->Deeper в массив, то:

 if (!is_array($decoded_json->NewDataSet->Deeper)) {
    $decoded_json->NewDataSet->Deeper = array($decoded_json->NewDataSet->Deeper);
}

foreach ($decoded_json->NewDataSet->Deeper as $state) {
    // ...
}
  

Комментарии:

1. 1 Это, по сути, то, что я делал, за исключением очистки с помощью is_array . Я просто создам закрытую функцию, которая поможет заполнить переданный ValueObject. Спасибо

2. итак, то, что вы говорите, применяется к большему количеству возможностей, чем глубже, и вы получаете решение, которое, хм, «улавливает их все»?