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

How to json_encode PHP object returned by Google Calendar API

首先 - 我不是 PHP 开发人员。我专注于前端,但我想通过一些个人项目来扩展我的 knowledge/play 以加深我的理解。因此,我的一些术语和对我想要实现的目标的基本理解可能有点...... 'off'.

我已按照 Google 提供的所有步骤进行操作,并成功使用 Google 日历 API,我可以使用简单的 [=] 列出日历事件16=]

我的问题在于如何使这些数据有用。我想用 JSON 来做到这一点。我知道 json_encode() 函数,但我不确定我应该如何在我想要实现的目标的上下文中使用它(即有一个 JSON 文件可以挂接到我的数据需要最终在前端显​​示日历)。我知道 json_encode() 尊重 属性 visibility/scope 但这是我的问题 - 我不知道如何确保 json_encode() 也会对受保护的 properties/methods 进行编码对象我被退回了。

这是我的代码:

$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);

我想引入受保护的 properties/methods,例如 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"
}

我真的很想在这里自学,不幸的是碰壁了,老实说,我找到的答案对我的理解来说有点太技术化了。欢迎技术和非技术解释!

感谢阅读。

因此,正如您所指出的,问题在于您要访问的属性受到保护,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);

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

所以 'getter' 方法可能是:$event->get('start')->dateTime 或其他。我没有使用 Google 日历 API 的经验,所以在这方面无法真正帮助您

最后,要知道您可以获得 PHP 脚本 echo json_encoded 结果,因此您不需要该文件。 (当然,我不知道你所有的代码是什么样的,所以这可能是个坏主意)

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

我遇到了和你一模一样的问题!我终于发现:

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

答案来自另一个post: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 文件。