正在解析从 Calendly.com 发送的 JSON 数据
Parsing JSON Data Sent from Calendly.com
我正在尝试将 calendly.com 发送的数据发送到我的网络服务器。我正在连接到该网络服务器,并且可以 post 使用
数据到它就好了
$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']
到
$data = $_POST['payload']
我也尝试过完全不同的方法
$json = file_get_contents('php://input');
$request = json_decode($json, true);
$thisemail = $request["payload"]["invitee"]["email"];
当我在 $thisemail
和 $full_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 无效。
方括号用于数组 ex。 ["Jane", "John", "Jack"]
大括号用于对象 ex。 {"name": "John", "surname" : "Wick"}
尝试
"extended_assigned_to": {
"name": "Jane Sample Data",
"email": "user@example.com",
"primary": false
},
而不是
"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);
}
P.S。不能直接在源代码中用大括号替换方括号。它会将数组 ["Jane", "John", "Jack"]
替换为 {"Jane", "John", "Jack"}
,而 JSON 也是无效的。
@blewherself 的回答揭示了一个重要事实,即 here 示例中的 JSON 无效 JSON,因此我赞成他们的回答。
不过,经过进一步调查,我确实认为这只是该页面的错误,他们传递的实际 JSON 并非无效。但是,我很高兴在这里添加我经过长期坚持后找到的答案,因为我认为 calendly.com 上的文档太简短,不是很有用。
可以使用 $HTTP_RAW_POST_DATA
检索 JSON 文件,否则您可以根据文档中的示例或多或少地访问各个组件,至少是我感兴趣的部分。喜欢所以
$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];
您会注意到一个明显的遗漏,他们的表格要求客户:phone 号码。看起来即使客户端被要求提供它,它也不会传递给 JSON 文件中的 url。此外,尽管名字和姓氏在文档的 JSON 示例中作为传递项给出,但它和示例中的许多其他项都没有以它们的形式被要求。我不确定他们希望如何在 JSON 中传递数据。我真诚地希望 calendly 的人们尽快解决这些问题。
我正在尝试将 calendly.com 发送的数据发送到我的网络服务器。我正在连接到该网络服务器,并且可以 post 使用
数据到它就好了$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']
到
$data = $_POST['payload']
我也尝试过完全不同的方法
$json = file_get_contents('php://input');
$request = json_decode($json, true);
$thisemail = $request["payload"]["invitee"]["email"];
当我在 $thisemail
和 $full_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 无效。
方括号用于数组 ex。 ["Jane", "John", "Jack"]
大括号用于对象 ex。 {"name": "John", "surname" : "Wick"}
尝试
"extended_assigned_to": {
"name": "Jane Sample Data",
"email": "user@example.com",
"primary": false
},
而不是
"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);
}
P.S。不能直接在源代码中用大括号替换方括号。它会将数组 ["Jane", "John", "Jack"]
替换为 {"Jane", "John", "Jack"}
,而 JSON 也是无效的。
@blewherself 的回答揭示了一个重要事实,即 here 示例中的 JSON 无效 JSON,因此我赞成他们的回答。
不过,经过进一步调查,我确实认为这只是该页面的错误,他们传递的实际 JSON 并非无效。但是,我很高兴在这里添加我经过长期坚持后找到的答案,因为我认为 calendly.com 上的文档太简短,不是很有用。
可以使用 $HTTP_RAW_POST_DATA
检索 JSON 文件,否则您可以根据文档中的示例或多或少地访问各个组件,至少是我感兴趣的部分。喜欢所以
$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];
您会注意到一个明显的遗漏,他们的表格要求客户:phone 号码。看起来即使客户端被要求提供它,它也不会传递给 JSON 文件中的 url。此外,尽管名字和姓氏在文档的 JSON 示例中作为传递项给出,但它和示例中的许多其他项都没有以它们的形式被要求。我不确定他们希望如何在 JSON 中传递数据。我真诚地希望 calendly 的人们尽快解决这些问题。