Как декодировать строку JSON с несколькими объектами в PHP? - PullRequest
17 голосов
/ 01 апреля 2010

Я знаю, как декодировать строку 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" }
 ]
}
  1. Как сделать только один foreach () для декодировать выше строки JSON?
  2. Как определить имена объектов: входящие, отправлено или черновик на этом foreach ()?

Ответы [ 2 ]

27 голосов
/ 01 апреля 2010

Новый ответ

Относительно вашего исправленного вопроса: 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...
}
8 голосов
/ 01 апреля 2010

Вы можете использовать функцию 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...