2015-08-26 59 views
1

我得到JSON從每個請求的API數據,但我不知道如何解析它。這種JSON格式中的某些字段將始終存在,而其他字段則可以互換。請參閱下面的示例進行說明。適當和有效的方式來解析「嵌套」 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,從和聊天是相同的,而最後一個可能是一些爲文本貼紙照片音頻和等(各這是分開的類,我需要給出的消息obj的字段來創建對象和初始化它的屬性ECT)。除此之外,可能還有一些額外的(可選)字段。這就是爲什麼我不能用下面的辦法解析:

$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循環來分析整個數據,但我沒有發現它適用於這種情況(或者我只是不能應用這種方法)。

我真的很感激,對解析這些數據的方式您的建議和指導。

+2

的情況下,如果你想檢查的屬性存在,你可以使用這個恰當命名的函數http://php.net/manual/en/function.property-exists.php – rjdown

+0

你告訴我們你的問題,但不是你實際想要達到的目標。喜歡詳細說明一下? – RiggsFolly

+0

爲了解決我列出的問題,比如解析這類對象的最佳實踐以及如何找到對象的長度。 @RiggsFolly抱歉,如果還不夠清楚,我只是認爲標題澄清了我想要達到的目標,我會再次通讀這篇文章並試圖闡述。歡呼聲指出 – fiz

回答

0

property_exists

該函數檢查是否在指定的類中存在給定的屬性。

在對象的情況下,設置屬性使用它,或者通過「」 //空

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

在一個陣列

$json_decoded = json_decode($json,true); 

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