Как декодировать строку JSON с несколькими объектами в PHP?
Я знаю, как декодировать строку JSON с одним объектом с вашей помощью из этого примера Как декодировать строку JSON
Но теперь я хотел бы улучшить декодирование строки JSON несколькими объектами, и я не могу понять, как это сделать.
Вот пример:
{ "inbox": [
{ "firstName": "Brett", "lastName":"McLaughlin" },
{ "firstName": "Jason", "lastName":"Hunter" },
{ "firstName": "Elliotte", "lastName":"Harold" }
],
"sent": [
{ "firstName": "Isaac", "lastName": "Asimov" },
{ "firstName": "Tad", "lastName": "Williams" },
{ "firstName": "Frank", "lastName": "Peretti" }
],
"draft": [
{ "firstName": "Eric", "lastName": "Clapton" },
{ "firstName": "Sergei", "lastName": "Rachmaninoff" }
]
}
- Как сделать только один foreach() для
расшифровать строку JSON?
- Как определить имена объектов: входящие,
отправлено или черновик на этом foreach()?
Ответы
Ответ 1
Новый ответ
Повторите свой пересмотренный вопрос: foreach
работает со свойствами, а также с многозначными элементами (массивами), здесь. Так, например, с строкой JSON в вашем вопросе:
$data = json_decode($json);
foreach ($data as $name => $value) {
// This will loop three times:
// $name = inbox
// $name = sent
// $name = draft
// ...with $value as the value of that property
}
В вашем основном цикле над свойствами вы можете использовать внутренний цикл, чтобы перебирать записи массива, на которые указывает каждое свойство. Например, если вы знаете, что каждый из свойств верхнего уровня имеет значение массива и что каждая запись массива имеет свойство "firstName", этот код:
$data = json_decode($json);
foreach ($data as $name => $value) {
echo $name . ':'
foreach ($value as $entry) {
echo ' ' . $entry->firstName;
}
}
... покажет:
inbox:
Brett
Jason
Elliotte
sent:
Issac
Tad
Frank
draft:
Eric
Sergei
Старый ответ (ы)
Начать редактирование
Ваш комментарий:
Теперь я хотел бы знать, как декодировать строку JSON с несколькими объектами!
В примере, который вы опубликовали, есть несколько объектов, они всего лишь содержатся в одном объекте-оболочке. Это требование JSON; вы не можете (например) сделать это:
{"name": "I'm the first object"},
{"name": "I'm the second object"}
То, что JSON недействительно. Должен быть один объект верхнего уровня. Он может содержать массив:
{"objects": [
{"name": "I'm the first object"},
{"name": "I'm the second object"}
]}
... или, конечно, вы можете указать имена отдельных объектов:
{
"obj0": {"name": "I'm the first object"},
"obj1": {"name": "I'm the second object"}
}
Редактирование конца
Ваш пример - это один объект, содержащий три свойства, значение каждого из которых представляет собой массив объектов. Фактически, он не сильно отличается от примера в связанном вами вопросе (который также имеет объект со свойствами, имеющими значения массива).
Итак:
$data = json_decode($json);
foreach ($data->programmers as $programmer) {
// ...use $programmer for something...
}
foreach ($data->authors as $author) {
// ...use $author for something...
}
foreach ($data->musicians as $musician) {
// ...use $musician for something...
}
Ответ 2
Вы можете использовать функцию json_decode
для декодирования строки JSON:
$json = <<<JSON
{ "programmers": [
{ "firstName": "Brett", "lastName":"McLaughlin" },
{ "firstName": "Jason", "lastName":"Hunter" },
{ "firstName": "Elliotte", "lastName":"Harold" }
],
"authors": [
{ "firstName": "Isaac", "lastName": "Asimov" },
{ "firstName": "Tad", "lastName": "Williams" },
{ "firstName": "Frank", "lastName": "Peretti" }
],
"musicians": [
{ "firstName": "Eric", "lastName": "Clapton" },
{ "firstName": "Sergei", "lastName": "Rachmaninoff" }
]
}
JSON;
$data = json_decode($json);
Затем, чтобы посмотреть, как выглядят данные, вы можете сбросить его:
var_dump($data);
И вы увидите, что у вас есть объект, содержащий три массива, каждый из которых содержит другие под-объекты:
object(stdClass)[1]
public 'programmers' =>
array
0 =>
object(stdClass)[2]
public 'firstName' => string 'Brett' (length=5)
public 'lastName' => string 'McLaughlin' (length=10)
1 =>
object(stdClass)[3]
public 'firstName' => string 'Jason' (length=5)
public 'lastName' => string 'Hunter' (length=6)
...
public 'authors' =>
array
0 =>
object(stdClass)[5]
public 'firstName' => string 'Isaac' (length=5)
public 'lastName' => string 'Asimov' (length=6)
...
Это означает, что вы знаете, как получить доступ к вашим данным.
Например, чтобы отобразить список программистов, вы можете использовать:
foreach ($data->programmers as $programmer) {
echo $programmer->firstName . ' ' . $programmer->lastName . '<br />';
}
Что принесет вам следующий результат:
Brett McLaughlin
Jason Hunter
Elliotte Harold