由于PHP中的领先括号,无法解析JSON字段

时间:2015-01-28 21:38:34

标签: php json email mandrill

我正在尝试为Mandrill创建一个webhook,当先前发送的电子邮件退回时,该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);
?>

这是$ json数据在$ message变量中的样子。它是我收到的测试电子邮件的文字副本和粘贴:

  

STRIPSLASHES:[{&#34; event&#34;:&#34; spam&#34;,&#34; msg&#34;:{&#34; ts&#34;:1365109999,&#34; subject&#34;:&#34;这是一个示例webhook消息&#34;,&#34; email&#34;:&#34; example.webhook@mandrillapp.com" ;,&#34; sender&#34; :&#34; example.sender@mandrillapp.com",&#34;标记&#34;:[&#34;网络挂接-例&#34],&#34;打开&#34;:[{& #34; TS&#34;:1365111111}],&#34;点击&#34;:[{&#34; TS&#34;:1365111111,&#34; URL&#34;:&#34; HTTP:/ /mandrill.com"}],"state":"sent","metadata":{"user_id":111}, &#34; _id&#34;:&#34; exampleaaaaaaaaaaaaaaaaaaaaaaaaa&#34;&#34; _version&#34;:&#34; exampleaaaaaaaaaaaaaaa&#34;}&#34; _id&#34;:&#34; exampleaaaaaaaaaaaaaaaaaaaaaaaaa&#34;&#34; TS&#34;:1422475458},{&#34;事件&#34;:&#34;垃圾邮件&#34;&#34; MSG&#34; {&#34; ts&#34;:1365109999,&#34; subject&#34;:&#34;这是一个示例webhook消息&#34;,&#34; email&#34;:&#34; example.webhook@mandrillapp.com&# 34;,&#34;发件人&#34;:&#34; example.sender@mandrillapp.com",&#34;标记&#34;:[&#34;网络挂接-例&#34],& #3 4;打开&#34;:[{&#34; TS&#34;:1365111111}],&#34;点击&#34;:[{&#34; TS&#34;:1365111111,&#34; URL&# 34;:&#34; HTTP://mandrill.com"}],&#34;状态&#34;:&#34;发送&#34;&#34;元数据&#34 ;: {&# 34; USER_ID&#34;:111}&#34; _id&#34;:&#34; exampleaaaaaaaaaaaaaaaaaaaaaaaaa1&#34;&#34; _version&#34;:&#34; exampleaaaaaaaaaaaaaaa&#34;}&#34 ; _id&#34;:&#34; exampleaaaaaaaaaaaaaaaaaaaaaaaaa1&#34;&#34; TS&#34;:1422475458}] ---- ---- JSONDATA阵列

我注意到$ json正在输出json数据,但是有一个前导和结束括号,而不是以一个波浪形括号开头。所以我决定将数据称为数组,但无济于事。

在测试中,而不是做$ json = stripslashes(...我将上面的json数据复制并粘贴为文字字符串。一旦我删除了前导/结束括号,我就能够解析一些数据。

2 个答案:

答案 0 :(得分:0)

为什么不尝试使用PHP删除括号?

$json = ltrim($json, "[");
$json = rtrim($json, ']");

然后将其传递给解码器?

答案 1 :(得分:0)

实际上,我能够通过以不同方式“抓取”json数据来修复它,在收到它时正确格式化:

$rawdata = file_get_contents('php://input');
$decodeurl = urldecode($data);
$jsonready = substr($decodeurl, 16);
$data = json_decode($jsonready, true);

$recipient = $data['0']['msg']['email'];
//etc, etc, etc

我按照这个例子:

https://sendy.co/forum/discussion/1137/using-mandrill-webhook-for-bounces-complaints/p1

我希望这可以帮助那些尝试使用Mandrill API的人!