Неперехваченная ошибка: невозможно использовать объект типа stdClass в качестве массива

Неустранимая ошибка: Uncaught Error: невозможно использовать объект типа stdClass в качестве массива

$code = json_decode($src);
echo $code["items"];

var_dump показывает следующее (усеченное):

object(stdClass)#7 (3) { ... } 

Я не знаю, что такое stdClass и как его использовать.

Изменить:

stdClass — это класс, который создает экземпляр простого объекта. Доступ к свойствам классов осуществляется с использованием нотации ->, а не [...].

В соответствии с документацией для json_decode, просто установив для второго аргумента значение true, в результате получается ассоциативный массив, к которому, в свою очередь, можно получить доступ как к массиву.

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


person Dan B.    schedule 28.01.2018    source источник
comment
Если вы знаете, что это дубликат, сделайте одолжение StackOverflow и волонтерам и не публикуйте его. Потратьте время, которое вам потребовалось, чтобы опубликовать вопрос, и просто выполните поиск SO.   -  person mickmackusa    schedule 28.01.2018


Ответы (2)


Используйте json_decode($src, true) для получения ассоциативного массива.

Это предпочтительный способ, так как в настоящее время вы получаете смешанные массивы и объекты, и вы можете оказаться в сумасшедшем доме, пытаясь работать с ними :)

В качестве альтернативы используйте оператор -> для получения свойств объекта.

В настоящее время ваш товар находится по адресу:

$code->items[0]->pagemap->cse_image[0]->src
person Rauli Rajande    schedule 28.01.2018
comment
@huykon225 huykon225 да, json_decode() требует, чтобы первым параметром была строка json - person Rauli Rajande; 22.07.2019

Функция json_decode имеет второй параметр, предназначенный именно для этого: установка его в true вернет ассоциативный массив, в котором есть объект (в { "curly": "braces" }) в JSON.

Чтобы проиллюстрировать это:

$a = json_decode('{ "b": 1 }', false);
var_dump($a->b);
// prints: int(1)

$a = json_decode('{ "b": 1 }', true);
var_dump($a['b']);
// prints: int(1)

Обратите внимание на разницу в способах доступа к значениям.

Дополнительная литература: http://php.net/json_decode

person ob-ivan    schedule 28.01.2018
comment
Для справки, этот ответ не является неправильным. Доказательство: sandbox.onlinephpfunctions.com/code/ Обычно я бы нейтрализовал этот отрицательный голос, но этот ответ делает очень мало для обучения, и ответ Раули является более полным с двумя способами решить проблему. (об-иван, вы можете удалить этот вопрос, чтобы восстановить 2 потерянных очка репутации) - person mickmackusa; 30.01.2018
comment
@micmackusa Спасибо за совет. На самом деле, я благодарен тому, кто проголосовал за это, потому что это напомнило мне, что ТАК существует для отличных ответов, а не для быстрых. Пожалуй, я оставлю это здесь --- для протокола. - person ob-ivan; 30.01.2018
comment
Если вы собираетесь оставить ответ, обновите его, чтобы предоставить больше полезной уникальной информации. Если это поможет кому-то еще, вы можете получить нейтрализующий голос и многое другое. - person mickmackusa; 30.01.2018
comment
@mickmackusa Спасибо. При цитировании официальной документации сложно предоставить уникальную информацию. Я надеюсь, по крайней мере, это будет лучший дайджест по конкретной теме, чем оригинал. - person ob-ivan; 30.01.2018
comment
пожалуйста, добавьте отформатированный комментарий под каждым var_dump, чтобы выразить вывод. Как 2_ - person mickmackusa; 30.01.2018
comment
@mickmackusa Готово. Кстати, есть ли краткое руководство, которое содержало бы все эти советы, которыми вы делитесь? Это может сэкономить нам обоим время и нажатия клавиш. - person ob-ivan; 30.01.2018
comment
Я ничего не могу придумать навскидку. Я рекомендую всегда доказывать свои ответы демонстрационной ссылкой, когда это возможно. Это гарантирует, что вы не сделали глупых синтаксических ошибок, и развеет любые сомнения в эффективности. Никогда не публикуйте ответы, содержащие только код. Никогда не размещайте дублирующую информацию; если вы опаздываете, либо удалите его, либо добавьте уникальное значение (не только ссылки на руководство), чтобы это не было простым раздуванием страницы. Всегда объясняйте свои решения с целью обучения тысяч будущих читателей SO. - person mickmackusa; 03.02.2018