我在开源邮件服务器Postal上遇到了类似的问题。在这种情况下,我使用 API 发送一封包含两个收件人的电子邮件。API 返回 JSON,我想对其进行处理以获取 Postal 分配给每条消息的消息 ID。根据 print_r,JSON 字符串解码为一系列嵌套对象。
pObj: stdClass Object
(
[status] => success
[time] => 0.28
[flags] => stdClass Object
(
)
[data] => stdClass Object
(
[message_id] => a122e786-6c32-4085-b1ed-023e5923ca38@rp.postal.domain.com
[messages] => stdClass Object
(
[name1@domain1.com] => stdClass Object
(
[id] => 180
[token] => AblVpj6UW2wh
)
[name2@domain2.com] => stdClass Object
(
[id] => 181
[token] => io5wgEXO1boH
)
)
)
)
从结构上看,前几层很容易提取。问题是消息对象具有为每个收件人电子邮件地址命名的属性。在事先不知道这些地址值的情况下,我无法以编程方式访问各个收件人对象以获取消息 ID。
我还使用 var_dump() 和 var_export() 检查了这个对象。这就是我看到这种奇怪且具有误导性的语法的地方:“stdClass::__set_state(array(”。但是这个对象中根本没有数组。实际上,这个结构只包含嵌套的对象和属性。
这种情况让我很不舒服,直到我问了正确的问题:对象属性的名称是什么?
现在编程解决方案相对容易,因为 PHP 有一个功能。我使用 get_object_vars() 来获取消息对象中的属性数组。通过简单地循环该数组,我可以访问每个地址的 id 和 token 属性。这是代码,带有来自 Postal 的示例 JSON 响应。
define('_EOL', "\n");
$json='{"status":"success","time":0.28,"flags":{},"data":{"message_id":"a122e786-6c32-4085-b1ed-023e5923ca38@rp.postal.domain.com","messages":{"name1@domain1.com":{"id":180,"token":"AblVpj6UW2wh"},"name2@domain2.com":{"id":181,"token":"io5wgEXO1boH"}}}}';
$pObj=json_decode($json);
$str='<pre>pObj: '.print_r($pObj, true)._EOL._EOL;
$str.=' - status='.$pObj->status._EOL;
$msgVars=get_object_vars($pObj->data->messages);
foreach ($msgVars as $varKey=>$msgObj)
{
$str.=' - '.$varKey.':'._EOL;
$str.=' - id='.$msgObj->id._EOL;
$str.=' - token='.$msgObj->token._EOL;
}
echo($str.'</pre>');
让这变得困难的是 Postal 设计在消息对象中使用变量属性名称。我会将消息制作成一个数组,并将电子邮件地址与属性 id 和令牌一起放入名为 address 的属性中。但它就是这样,我希望这对其他人有帮助。