如何json_encode Google Calendar API返回的PHP对象

时间:2015-09-13 20:17:07

标签: php json google-calendar-api

首先 - 我不是PHP开发人员。我专注于前端,但我想扩展我的知识/玩一些个人项目,以进一步了解。因此,我的一些术语和基本理解我想要实现的目标可能有点......“关闭”。

我已按照Google提供的所有步骤操作,并设法使用Google Calendar API,我可以使用简单的var_dump()

列出日历事件

我的问题在于尝试使这些数据变得有用。我想用JSON做到这一点。我知道json_encode()函数,但不确定我应该如何在我想要实现的内容中使用它(即有一个JSON文件可以挂钩到我最终需要显示的数据前端的日历)。我知道json_encode()尊重属性可见性/范围,但这是我的问题 - 我无法弄清楚如何确保json_encode()也将对我返回的对象中的受保护属性/方法进行编码。

这是我的代码:

$eventsArgs = array(
    'maxResults' => 10,
    'singleEvents' => true,
);

$events = $calendarService->events->listEvents('***@gmail.com', $eventsArgs);

$listEvents = fopen('list_events.json', 'w');

    foreach($events->getItems() as $event) {
        fwrite($listEvents, json_encode($event, JSON_PRETTY_PRINT));
    }

fclose($listEvents);

我想提取startend等受保护的属性/方法,如此处显示的简单var_dump() ...

["modelData":protected]=> array(5) {
["creator"]=>
array(3) {
  ["email"]=>
  string(23) "***@gmail.com"
  ["displayName"]=>
  string(14) "***"
  ["self"]=>
  bool(true)
}
["organizer"]=>
array(3) {
  ["email"]=>
  string(23) "***@gmail.com"
  ["displayName"]=>
  string(14) "***"
  ["self"]=>
  bool(true)
}
["start"]=>
array(1) {
  ["dateTime"]=>
  string(25) "2014-04-27T05:00:00+01:00"
}
["end"]=>
array(1) {
  ["dateTime"]=>
  string(25) "2014-04-27T06:00:00+01:00"
}

我真的想在这里教育自己,不幸的是,我找到了答案,如果我说实话,我找到的答案对我的理解来说有点太技术性了。技术和非技术解释欢迎!

感谢阅读。

2 个答案:

答案 0 :(得分:2)

因此,正如您所指出的那样,问题是您要访问的属性受到保护,json_encode尊重该属性,并且不会访问它们。 Read up on public, private, and protected. Good stuff

由于这些值受到保护,您必须将所需数据从$event提取到一个不受保护的数组中,然后再json_encode。未经测试的代码如下:

$eventsArgs = array(
    'maxResults' => 10,
    'singleEvents' => true,
);

$events = $calendarService->events->listEvents('***@gmail.com', $eventsArgs);

$listEvents = fopen('list_events.json', 'w');

foreach($events->getItems() as $event) {
    $jsonArr = array(
        "start"=>$event->start->dateTime
        ,"end"=>$event->end->dateTime
    );

    fwrite($listEvents, json_encode($jsonArr, JSON_PRETTY_PRINT));
}

fclose($listEvents);

现在即使该代码也可能无效。您可能必须找到适当的方法('方法'如同:属于某个类的函数)从Google日历事件中获取您想要的属性,然后将它们放入数组,而不是json_encode。

所以' getter'方法可能是:$event->get('start')->dateTime或其他东西。我没有使用Google Calendar API的经验,因此无法在这方面为您提供帮助

最后,要知道您可以将PHP脚本echo设为json_encode d结果,这样您就不会需要该文件。 (当然,我不知道你的所有代码是什么样的,所以这可能是一个坏主意)

foreach(...) {
    echo json_encode($yourArray);
}

答案 1 :(得分:1)

我和你有完全相同的问题!我终于找到了:

$json = json_encode( (array)$events);

答案来自另一篇文章:Here

请注意:

它在外部数组键上生成Unicode NUL字符:\ u0000 * \ u0000。但是具有起始值和结束值的完整结构仍然存在。如果您有兴趣删除Nul字符,可以使用str_replace()或explode。 Understanding what \u0000 is in PHP / JSON and getting rid of it

Terminus上面的答案很棒但是使用它对我的情况更可取,因为我需要匹配来自google node.js api的不同json文件。