Я знаю, как декодировать строку 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 в вашем вопросе:
$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; } }
…покажет:
Входящие: Brett Джейсон Elliotte послал: Айзек Тэд Фрэнк проект: Эрик Сергей
Начать редактирование Re:
Теперь я хотел бы знать, как декодировать строку 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... }
Вы можете использовать функцию 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