Правильный и эффективный способ разбора «вложенного» объекта JSON

1

Я получаю данные JSON от API по каждому запросу, но я не уверен, как его разобрать. Некоторые поля в этом формате JSON будут всегда присутствовать, тогда как другие являются взаимозаменяемыми. Ниже приведены примеры для пояснения.

     $json1 = '{
        "update_id": 12345,
        "message": {
           "message_id": 12,
           "from": {
               "id": 12345,
               "first_name": "Foo",
               "last_name": "Foo",
               "username": "foo"
            },
          "chat": {
               "id": 12345,
               "first_name": "Foo",
               "last_name": "Foo",
               "username": "foo"
           },
          "date": 1440592506,
          "text": "dummy"
        }
    }'; 



   $json2 = '{
      "update_id": 12345,
      "message": {
         "message_id": 13,
         "from": {
             "id": 12345,
             "first_name": "Foo",
             "last_name": "Foo",
             "username": "foo"
          },
        "chat": {
            "id": 12345,
            "first_name": "Foo",
            "last_name": "Foo",
            "username": "foo"
         },
       "date": 1440619228,
       "sticker": {
            "width": 510,
            "height": 512,
            "thumb": {
                "file_id": "dasdsdasd",
                "file_size": 6204,
                "width": 127,
                "height": 128
            },
           "file_id": "adasds",
           "file_size": 39518
      }
   }
 }';

Поскольку вы заметили, что поля в объекте сообщения, такие как message_id, из и в чате, одинаковы, тогда как последнее может быть чем-то вроде текста, стикера, фотографии, аудио и т.д. (Каждый из них - отдельные классы, и мне нужно создать объект и инициализировать его свойства, заданные полями объекта сообщения). В дополнение к этому могут быть дополнительные (необязательные) поля. И поэтому я не могу использовать следующий подход для синтаксического анализа:

$json_decoded = json_decode($json);

$updateID = $json_decoded->update_id;
$messageObject = $json_decoded->message;
$messageID = $messageObject->message_id;
$fromUserObject = $messageObject->from;
$date = $messageObject->date;
$chatObject = $messageObject->chat;
$userID = $fromUserObject->id;
$userFirstName = $fromUserObject->first_name;
$userLastName = $fromUserObject->last_name;
$userName = $fromUserObject->username;

Я видел несколько примеров, когда люди используют foreach loops для синтаксического анализа целых данных, но я не нашел его применимым в этом случае (или я просто не мог применить этот подход).

Я был бы очень признателен за ваши предложения и рекомендации по разбору этих данных.

  • 2
    Если вы хотите проверить, существует ли свойство, вы можете использовать эту метко названную функцию php.net/manual/en/function.property-exists.php
  • 1
    Вы рассказали нам о своих проблемах, но не о том, чего вы на самом деле пытаетесь достичь. Как уточнить?
Показать ещё 4 комментария
Теги:
arrays
parsing

1 ответ

0

property_exists

Эта функция проверяет, существует ли данное свойство в указанном классе.

В случае объекта устанавливается свойство use или передается ''//empty

$messageID = property_exists($messageObject->message_id) ? $messageObject->message_id: '' ;

В случае массива

$json_decoded = json_decode($json,true);

$messageID = isset($messageObject['message_id']) ? $messageObject['message_id'] : '' ;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню