【问题标题】:Unable to Parse JSON Fields Due to Leading Bracket in PHP由于 PHP 中的前导括号,无法解析 JSON 字段
【发布时间】: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 对解析结果进行调试输出,以便更好地了解您实际处理的内容。

标签: php json email mandrill


【解决方案1】:

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

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

然后传给解码器?

【讨论】:

  • 这是个坏主意,因为它是有效的 JSON。
  • 我的错 - 我认为解析是问题,因为您写道:“一旦我删除了前导/结束括号,我就能够解析一些数据”
  • 那不是我写的,是 OP 写的 @GratusD
  • 抱歉 :) - 现在说得通了。
【解决方案2】:

实际上,我能够通过以不同的方式“抓取”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 的人有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多