Php 解析从Calendly.com发送的JSON数据

Php 解析从Calendly.com发送的JSON数据,php,json,webhooks,calendly,Php,Json,Webhooks,Calendly,我正在尝试将发送的数据发送到我的Web服务器。我正在连接到该Web服务器,可以使用 $ch = curl_init($url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $myvars); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURL

我正在尝试将发送的数据发送到我的Web服务器。我正在连接到该Web服务器,可以使用

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $myvars);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$response = curl_exec($ch);

$myvars = 'first_name=' . $full_name . '&email=' . $thisemail;
但是,我很难将数据导入
$myvars
。我试过这个

$data = $_REQUEST['payload'];           
$unescaped_data = stripslashes($data);
$obj = json_decode($unescaped_data);
$thisemail = $obj->invitee->email;
$full_name = $obj->invitee->name;
但是这个变量没有填充。我也改变了主意

$data = $_REQUEST['payload']

我也尝试了一种完全不同的方法

$json = file_get_contents('php://input'); 
$request = json_decode($json, true);
$thisemail = $request["payload"]["invitee"]["email"];
当我在
$thismail
$full\u name
中输入伪字符串时,它会按预期工作

我还读到这个数据是
gzip
编码的。所以我也试着改变这一点

$request = json_decode($json, true);
对此

$request = gzdecode($json);
但也没有效果

下面是数据应该是什么样子的一个片段

{
  "event":"invitee.created",
  "time":"2016-08-23T19:16:01Z",
  "payload":{
    "event_type":{
      "kind":"1-on-1",
      "slug":"event_type_name",
      "name":"Event Type Name",
      "duration":15
    },
    "event":{
      "uuid":"BBBBBBBBBBBBBBBB",
      "assigned_to":[
        "Jane Sample Data"
      ],
      "extended_assigned_to": [
        "name": "Jane Sample Data",
        "email": "user@example.com",
        "primary": false
      ],
      "start_time":"2016-08-23T12:00:00Z",
      "start_time_pretty":"12:00pm - Tuesday, August 23, 2016",
      "invitee_start_time":"2016-08-23T12:00:00Z",
      "invitee_start_time_pretty":"12:00pm - Tuesday, August 23, 2016",
      "end_time":"2016-08-23T12:15:00Z",
      "end_time_pretty":"12:15pm - Tuesday, August 23, 2016",
      "invitee_end_time":"2016-08-23T12:15:00Z",
      "invitee_end_time_pretty":"12:15pm - Tuesday, August 23, 2016",
      "created_at":"2016-08-23T00:00:00Z",
      "location":"The Coffee Shop",
      "canceled":false,
      "canceler_name":null,
      "cancel_reason":null,
      "canceled_at":null
    },
    "invitee":{
      "uuid":"AAAAAAAAAAAAAAAA",
      "first_name":"Joe",
      "last_name":"Sample Data",
      "name":"Joe Sample Data",
      "email":"not.a.real.email@example.com",

     ...
JSON无效。
方括号用于数组,例如
[“Jane”、“John”、“Jack”]

大括号用于对象,例如:
{“name”:“John”,“姓氏”:“Wick”}

试一试

而不是

  "extended_assigned_to": [
                "name": "Jane Sample Data",
                "email": "user@example.com",
                "primary": false
            ],
在这种情况下,您可以编写一个函数,在将编码后的JSON提供给JSON解码之前纠正错误。我已经编写了一个函数,可以使用正则表达式为您处理它。它正在搜索冒号放在方括号中并用大括号替换的所有情况。应在一次响应中处理任意数量的此类案例。希望这会有帮助

function correctJSON ($string) {
//Get an array of all cases with invalid brackets
    preg_match_all('/\[".*":.*\]/', $string, $matches);

//Create an array with braces with inside content to replace with       
    for($i=0; $i<count($matches[0]); $i++) {
        $replace[$i] = str_replace(array('[',']'), array('{','}'), $matches[0][$i]);    
    }

//Replace
    return $string = str_replace($matches[0], $replace, $string);
}
函数correctJSON($string){
//获取具有无效括号的所有事例的数组
preg_match_all('/\[“*”:.*\]/',$string,$matches);
//创建一个数组,其中包含要替换的内部内容的大括号

对于($i=0;$i@blewherself的答案揭示了一个重要事实,即示例中找到的JSON不是有效的JSON,因此我对他们的答案进行了投票

然而,经过进一步的调查,我相信这仅仅是该页面的一个错误,并且他们传递的实际JSON并不是无效的。然而,我很高兴在这里添加我的答案,这是我在长期坚持之后发现的,因为我相信,上的文档太简短了,不太有用

JSON文件可以使用
$HTTP_RAW_POST_DATA
检索,否则您可以根据文档中的示例或多或少地访问各个组件,至少是我感兴趣的部分。就像这样

$data = json_decode($HTTP_RAW_POST_DATA, true);
$full_name = $data["payload"]["invitee"]["name"];
$thisemail = $data["payload"]["invitee"]["email"];
$first_name = explode(" ", $full_name)[0];
$last_name = explode(" ", $full_name)[1];

您会注意到,他们的表单中有一个明显的遗漏,即询问客户:电话号码。看起来,即使客户被要求提供电话号码,它也不会在JSON文件中传递到您的url。此外,尽管在文档的JSON示例中,名字和姓氏是作为传递项给出的,但在他们的f中,它和示例中的许多其他项都不会被要求提供orm。我不确定他们希望数据如何在JSON中传递。我真诚希望现场人员尽快解决这些问题。

我对JSON没有任何控制权。它是由calendly.com的人员发布到我的页面上的。我在jsonlint.com上验证了您的JSON片段,它说JSON无效。一旦JSON无效,您将得到空a在使用json_decode之后。我相信这就是你无法从请求中获取数据的原因。它不是完整的json。我想知道如果你输入完整的json,它是否有效。对于完整的json,你可以去。在任何情况下,如果calendly.com没有向我发送有效的json,那么我真的不确定该怎么做。除了“extended_将_分配给”应该放在{}而不是[]中的对象。我相信在使用json_解码之前,您必须写下一个正则表达式来替换括号。我将在几个小时后尝试提供帮助”在POST请求的情况下,最好使用php://input 而不是$HTTP_RAW_POST_数据,因为它不依赖于特殊的php.ini指令。“来源:
function correctJSON ($string) {
//Get an array of all cases with invalid brackets
    preg_match_all('/\[".*":.*\]/', $string, $matches);

//Create an array with braces with inside content to replace with       
    for($i=0; $i<count($matches[0]); $i++) {
        $replace[$i] = str_replace(array('[',']'), array('{','}'), $matches[0][$i]);    
    }

//Replace
    return $string = str_replace($matches[0], $replace, $string);
}
$data = json_decode($HTTP_RAW_POST_DATA, true);
$full_name = $data["payload"]["invitee"]["name"];
$thisemail = $data["payload"]["invitee"]["email"];
$first_name = explode(" ", $full_name)[0];
$last_name = explode(" ", $full_name)[1];