- Как извлечь данные из JSON с помощью PHP?
- 5 ответов
- вступление
- Доступ к свойствам объекта
- Доступ к элементам массива
- Доступ к вложенным элементам
- Передача true в качестве второго аргумента в json_decode()
- Не знаю, как структурированы данные
- json_decode() возвращает null
- Имя свойства объекта содержит специальный символ
- Кто-то положил JSON в ваш JSON
- Данные не помещаются в памяти
- Как это отсортировать
- пример
- пример
- Как получить значение объекта?
- Как получить данные из объекта
- Решение
Как извлечь данные из 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.
Объекты будут экземплярами 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
Это происходит потому, что либо:
- JSON полностью состоит только из этого, null .
- JSON недействителен — проверьте результат json_last_error_msg или json_last_error_msg его через что-то вроде JSONLint.
- Он содержит элементы, вложенные более 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-объект -.