2015-08-26 24 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'] : '' ;