Php вытащить из объекта

Как извлечь данные из JSON с помощью PHP?

Это предназначено для общего справочного вопроса и ответа, охватывающего многие из бесконечных «Как мне получить доступ к данным в моем JSON?» вопросов. Здесь мы рассмотрим широкие основы декодирования JSON в PHP и доступа к результатам.

Могу ли я узнать, почему этот вопрос не рассматривается как дублирующий вопрос даже для 9 или менее пользователей, помеченных как дубликаты для stackoverflow.com/questions/4343596/parsing-json-file-with-php ? M

@IamtheMostStupidPerson Я постараюсь объяснить, хотя ваше имя пользователя заставляет меня сомневаться, что вы его получите;). Этот вопрос задается, а его ответы пишутся «каноническим» образом. Таким образом, это лучший получатель для дубликата цели, чем другие вопросы.

5 ответов

вступление

Во-первых, у вас есть строка. JSON не является массивом, объектом или структурой данных. JSON — это текстовый формат сериализации — такая необычная строка, но все же просто строка. Расшифруйте его в PHP с помощью json_decode() .

Это те вещи, которые могут быть закодированы в JSON. Точнее, это версии PHP вещей, которые можно кодировать в JSON.

В них нет ничего особенного. Они не являются «объектами JSON» или «массивами JSON». Вы расшифровали JSON — теперь у вас есть базовые повседневные типы PHP.

Читайте также:  All java script functions

Объекты будут экземплярами stdClass, встроенного класса, который является просто общей вещью, которая здесь не важна.

Доступ к свойствам объекта

Вы получаете доступ к свойствам одного из этих объектов так же, как и к общедоступным нестатическим свойствам любого другого объекта, например, $object->property .

$json = ' < "type": "donut", "name": "Cake" >'; $yummy = json_decode($json); echo $yummy->type; //donut 

Доступ к элементам массива

Вы получаете доступ к элементам одного из этих массивов так же, как и для любого другого массива, например, $array[0] .

$json = ' [ "Glazed", "Chocolate with Sprinkles", "Maple" ]'; $toppings = json_decode($json); echo $toppings[1]; //Chocolate with Sprinkles 
foreach ($toppings as $topping)

глазированный
Шоколад с окропляет
кленовый

Доступ к вложенным элементам

Свойства объектов и элементов массивов могут быть больше объектов и/или массивов — вы можете просто продолжать получать доступ к их свойствам и членам как обычно, например, $object->array[0]->etc

$json = ' < "type": "donut", "name": "Cake", "toppings": [ < "id": "5002", "type": "Glazed" >, < "id": "5006", "type": "Chocolate with Sprinkles" >, < "id": "5004", "type": "Maple" >] >'; $yummy = json_decode($json); echo $yummy->toppings[2]->id; //5004 

Передача true в качестве второго аргумента в json_decode()

Когда вы сделаете это, вместо объектов вы получите ассоциативные массивы — массивы со строками для ключей. Снова вы получаете доступ к его элементам, как обычно, например, $array[‘key’] .

$json = ' < "type": "donut", "name": "Cake", "toppings": [ < "id": "5002", "type": "Glazed" >, < "id": "5006", "type": "Chocolate with Sprinkles" >, < "id": "5004", "type": "Maple" >] >'; $yummy = json_decode($json, true); echo $yummy['toppings'][2]['type']; //Maple 

Не знаю, как структурированы данные

Прочитайте документацию о том, что вы получаете JSON.

Посмотрите на JSON — где вы видите фигурные скобки <> ожидают объект, где вы видите квадратные скобки [] ожидают массив.

Нажмите на декодированные данные с помощью print_r() :

$json = ' < "type": "donut", "name": "Cake", "toppings": [ < "id": "5002", "type": "Glazed" >, < "id": "5006", "type": "Chocolate with Sprinkles" >, < "id": "5004", "type": "Maple" >] >'; $yummy = json_decode($json); print_r($yummy); 
stdClass Object ( [type] => donut [name] => Cake [toppings] => Array ( [0] => stdClass Object ( [id] => 5002 [type] => Glazed ) [1] => stdClass Object ( [id] => 5006 [type] => Chocolate with Sprinkles ) [2] => stdClass Object ( [id] => 5004 [type] => Maple ) ) ) 

Он скажет вам, где у вас есть объекты, где у вас есть массивы, а также имена и значения их членов.

Если вы можете зайти так далеко, прежде чем заблудитесь — зайдите так далеко и попробуйте это с помощью print_r() :

stdClass Object ( [id] => 5002 [type] => Glazed ) 

Разбейте проблему на части, которые легче обернуть вокруг.

json_decode() возвращает null

Это происходит потому, что либо:

  1. JSON полностью состоит только из этого, null .
  2. JSON недействителен — проверьте результат json_last_error_msg или json_last_error_msg его через что-то вроде JSONLint.
  3. Он содержит элементы, вложенные более 512 уровней. Эту максимальную глубину по умолчанию можно изменить, передав целое число в качестве третьего аргумента json_decode() .

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

Имя свойства объекта содержит специальный символ

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

$json = '>'; $thing = json_decode($json); echo $thing->->answer; //42 

Кто-то положил JSON в ваш JSON

Это смешно, но бывает — JSON закодирован как строка внутри вашего JSON. Расшифруйте, получите доступ к строке как обычно, расшифруйте ее и в конечном итоге получите то, что вам нужно.

$json = ' < "type": "donut", "name": "Cake", "toppings": "[< \"type\": \"Glazed\" >, < \"type\": \"Maple\" >]" >'; $yummy = json_decode($json); $toppings = json_decode($yummy->toppings); echo $toppings[0]->type; //Glazed 

Данные не помещаются в памяти

Если ваш JSON слишком велик для того, чтобы json_decode() мог его обработать сразу, все начинает усложняться. Увидеть:

Как это отсортировать

Единственное, чего не хватает этому решению, это как извлечь данные из другого файла json. Я бы порекомендовал это решение: stackoverflow.com/questions/19758954/…

Вы можете использовать json_decode() для преобразования строки json в объект/массив PHP.

Входные данные :

$json = ''; var_dump(json_decode($json)); var_dump(json_decode($json, true)); 
object(stdClass)#1 (5) < ["a"] =>int(1) ["b"] => int(2) ["c"] => int(3) ["d"] => int(4) ["e"] => int(5) > array(5) < ["a"] =>int(1) ["b"] => int(2) ["c"] => int(3) ["d"] => int(4) ["e"] => int(5) > 

Несколько пунктов для запоминания:

  • json_decode требует, чтобы строка была действительным json else, она вернет NULL .
  • В случае отказа декодирования json_last_error() может использоваться для определения точного характера ошибки.
  • Убедитесь, что вы передаете содержимое utf8 , или json_decode может выйти из строя и просто вернуть значение NULL .

Вероятно, более вероятная причина в том, что на него уже дан ответ, и похоже, что @MohdAbdulMujib после некоторого бесплатного повторения

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

Я написал пакет с именем JSON (GitHub, Packagist). Если вы хотите избежать накладных расходов на использование функций json_* , попробуйте это.

пример

use MAChitgarha\Component\JSON; $jsonStr = , < "id": "5006", "type": "Chocolate with Sprinkles" >, < "id": "5004", "type": "Maple" >] > JSON; // Create an instance $json = new JSON($jsonStr); // Get a nested element using dots $json->get("toppings.1.type"); // Chocolate with Sprinkles $json["toppings.1.type"]; // Chocolate with Sprinkles // Iterate over an element foreach ($json->iterate("toppings") as $item) echo "id>: type>", PHP_EOL; // Change an element $json->set("toppings.3", [ "id" => "5000", "type" => "Unknown" ]); // Get data as JSON string, array or object, respectively $json->getDataAsJson(); $json->getDataAsArray(); $json->getDataAsObject(); 

Посмотрите вики или краткое руководство, чтобы ознакомиться с ним.

Более того, если вы хотите прочитать файлы JSON и извлечь их данные (как вы, кажется, пытаетесь это сделать), посмотрите пакет JSONFile, который я тоже написал.

Вы можете использовать пакет JSON (GitHub, Packagist). Вы можете легко установить его с помощью Composer.

пример

use MAChitgarha\Component\JSON; $jsonStr = , < "id": "5006", "type": "Chocolate with Sprinkles" >, < "id": "5004", "type": "Maple" >] > JSON; // Create an instance $json = new JSON($jsonStr); // Get a nested element using dots $json->get("toppings.1.type"); // Chocolate with Sprinkles $json["toppings.1.type"]; // Chocolate with Sprinkles // Iterate over an element foreach ($json->iterate("toppings") as $item) echo "id>: type>", PHP_EOL; // Change an element $json->set("toppings.3", [ "id" => "5000", "type" => "Unknown" ]); // Get data as JSON string, array or object, respectively $json->getDataAsJson(); $json->getDataAsArray(); $json->getDataAsObject(); 

Посмотрите вики или краткое руководство, чтобы ознакомиться с ним.

Кроме того, если вы хотите прочитать файлы JSON и извлечь их данные (как вы, кажется, пытаетесь это сделать), см. Пакет JSONFile.

Источник

Как получить значение объекта?

Простой вопрос по синтаксису. Есть объекты $ob, если сделать print_r($ob) , то выводится:

stdClass Object ( [XXXXX] => stdClass Object ( [id] => 111111 [name] => XXXXX ) )

Мне нужно получить значение name и id, если знать, что там «XXXXX», то я знаю как получить

$name = $ob->XXXXX->name; $id = $ob->XXXXX->id;

Но если ХХХХХ постоянно меняется, как получать $name и $id?

Оценить 2 комментария

Уточню, кроме этого объекта нет больше данных, только $ob. Если сделать print_r($ob), то выводит, то что я писал выше. При каждом обновлении страницы $ob будет другой.

Как получать и выводить $name и $id ?

В общем из комментариев @hlogeon стало понятно, что объект можно перевести в массив

$objArr = (array)$ob; foreach ($objArr as $key => $value)< $name = $value->name; $id = $value->id; > echo "$name"; echo "$id";
$foo = new Foo(); $reflect = new ReflectionClass($foo); $props = $reflect->getProperties(ReflectionProperty::IS_PUBLIC);

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

$names = array(); $ids = array(); foreach($props as $property)< $propName = $property->getName(); $names[] = $object->$propName->name; $ids[] = $object->$propName->id; >

Или как то так. Я надеюсь, общая мысль ясна и я правильно понял вопрос

Я к посту сделал уточняющие комментарии. Объект получен путем обработки файла функцией json_decode, поэтому с вашим кодом у меня возникают трудности с первой строчки. Про класс объекта я ничего не знаю.

Пробовал, что-то такое $foo = new stdClass(); не работает.

Так вам ничего и не надо знать про класс же.

$reflect = new ReflectionClass($yourNewJsonDecodedObject);

В чем проблема такого создания ReflectionClass?
В чем проблема привести ваш объект к \ArrayObject?
В чем проблема привести ваш объект к ассоциативному массиву?

$yourNewJsonDecodedObject = json_decode($some_string);
$reflect = new ReflectionClass($yourNewJsonDecodedObject);

Если сделать
print_r($reflect);
то выдает
ReflectionClass Object ( [name] => stdClass )

В вашем коде есть строчка

Если сделать
print_r($props);

И в целом массивы имен и айди пустые.

Источник

Как получить данные из объекта

Как получить данные из объекта?
Подключаю файл *.tlb, далее создаю объект "Frame", он создается с параметрами по умолчанию, далее.

Как в представлении вместо ID объекта связанной таблицы получить данные о нем?
Доброго времени суток. Прошу помочь в следующем вопросе: Имеется БД Состоящая из 5 связанных.

Получить данные DOM из объекта
Что я хочу сделать : При нажатии на кнопку «Добавить статью», появляется форма с двумя полями.

Получить данные объекта, выбранного в селекторе
Есть сущность Products, у каждого продукта есть тайтл, цена. В контролере продукта я создал метод.

Лучший ответ

Сообщение было отмечено Rise456 как решение

Решение

свойству объекта доступ получаем через оператор -> , тк свойство массив — к его элементам по ключу/индексу
другой вариант конвертировать объекты в массив (array)$data , работать с массивом

var_dump($data->response[0]->first_name); var_dump($data->response[0]->id); var_dump($data->response[0]->last_name);

Как вытащить данные из объекта?
Доброго времени суток! Есть структура граф. Есть два представления Л и М граф. В конструкторе графа.

Как вывести данные из объекта?
Есть объект config::gi() , он содержит: Config Object ( => Array ( .

Как вытащить данные из ole объекта?
в каждой стоке таблицы зашит объект ole (рисунок формата bmp), как можно можно сохранить этот.

Как вывести данные из объекта в переменную?
Я хочу вывести значение поля id, но у меня чет не получилось сделать это через foreach, не особо.

Как получить размер объекта
Доброго времени суток вопрос: как можно получить размер объекта? к примеру есть 3d-объект -.

Источник

Оцените статью