【发布时间】:2015-03-27 23:33:38
【问题描述】:
我正在尝试为 Mandrill 创建一个 webhook,当之前发送的电子邮件被退回时,它将向发件人发送一封电子邮件。我能够从 Mandrill 接收 JSON 数据,但无法解析该数据以发送给原始发件人:
<?php
require_once 'mandrill-api-php/src/Mandrill.php'; //Not required with Composer
$mandrill = new Mandrill('*myapikey*');
$json = stripslashes($_POST['mandrill_events']);
$jsondata = json_decode($json,true);
$subject = $jsondata['event'];
$message = "STRIPSLASHES: ".$json."----JSONDATA----".$jsondata;
$emailAddress = "*me@mydomain.com*";
mail($emailAddress, $subject, $message);
?>
这是 $message 变量中 $json 数据的样子。这是我收到的测试电子邮件的文字复制和粘贴:
STRIPSLASHES: [{"event":"spam","msg":{"ts":1365109999,"subject":"这是一个示例 webhook 消息","email":"example.webhook@mandrillapp.com ","sender":"example.sender@mandrillapp.com","tags":["webhook-example"],"opens":[{"ts":1365111111}],"clicks":[{"ts ":1365111111,"url":"http://mandrill.com"}],"state":"sent","metadata":{"user_id":111},"_id":"exampleaaaaaaaaaaaaaaaaaaaaaaaa","_version ":"exampleaaaaaaaaaaaaaaa"},"_id":"exampleaaaaaaaaaaaaaaaaaaaaaaaaaa","ts":1422475458},{"event":"spam","msg":{"ts":1365109999,"subject":"这是一个例子webhook 消息","email":"example.webhook@mandrillapp.com","sender":"example.sender@mandrillapp.com","tags":["webhook-example"],"opens":[{ "ts":1365111111}],"clicks":[{"ts":1365111111,"url":"http://mandrill.com"}],"state":"sent","元数据":{" user_id":111},"_id":"exampleaaaaaaaaaaaaaaaaaaaaaa1","_version":"exampleaaaaaaaaaaaaaaaa"},"_id":"exampleaaaaaaaaaaaaaaaaaaaaaa1","ts":1422475458}]----JSONDATA----数组
我注意到 $json 正在输出 json 数据,但有一个前导和结束括号,而不是以波浪形括号开头。所以我决定把数据当作一个数组来调用,但是没有用。
在测试中,我没有执行 $json = stripslashes(... 我将上面的 json 数据复制并粘贴为文字字符串。删除前导/结束括号后,我就能够解析一些数据。
【问题讨论】:
-
也许将其转换为字符串(使用 stringify)然后删除/替换那些前导/结束括号,然后解析 json?我在过去的一个项目中遇到过类似的问题,必须在我的值中转义特殊字符或更改类型并尝试解析 json。祝你好运。
-
从方括号到方括号,JSON 是有效的。 jsonlint.com
STRIPSLASHES:不是有效的 JSON,它缺少引号。 -
echo $jsondata[0]['msg']['sender']; -
数组的问题在哪里?它可能是多个事件,所以它必须是一个数组?
-
“一旦我删除了前导/结束括号,我就能够解析一些数据” – 获取数据解析不是你的问题;它使用正确的语法来访问结果数据结构中的元素。因此,请使用
var_dump对解析结果进行调试输出,以便更好地了解您实际处理的内容。