从 google api 收到的列表中的嵌套字典未被解析

Nested dictionary in a list received from google api not getting parsed

我过去几天一直在尝试从嵌套列表中的每个类型的嵌套字典中检索 "start""end" 的所有 "dateTime" 值循环,但我还没有成功。有谁知道我将如何处理它?

AllCals =     [
        {
            "accessRole": "reader",
            "defaultReminders": [],
            "etag": "\"\"",
            "items": [],
            "kind": "calendar#events",
            "nextSyncToken": "=",
            "summary": "Holidays in Canada",
            "timeZone": "America/Toronto",
            "updated": "2020-11-09T20:44:17.000Z"
        },
        {
            "accessRole": "owner",
            "defaultReminders": [],
            "etag": "\"\"",
            "items": [],
            "kind": "calendar#events",
            "nextSyncToken": "=",
            "summary": "Business Sim",
            "timeZone": "America/Toronto",
            "updated": "2020-10-26T19:23:14.031Z"
        },
        {
            "accessRole": "owner",
            "defaultReminders": [],
            "etag": "\"\"",
            "items": [],
            "kind": "calendar#events",
            "nextSyncToken": "=",
            "summary": "COMN",
            "timeZone": "America/Toronto",
            "updated": "2020-11-05T20:15:35.506Z"
        },
        {
            "accessRole": "owner",
            "defaultReminders": [],
            "etag": "\"\"",
            "items": [
                {
                    "created": "2020-11-09T16:45:47.000Z",
                    "creator": {
                        "email": "@gmail.com"
                    },
                    "end": {
                        "dateTime": "2020-11-10T18:30:00-05:00"
                    },
                    "etag": "\"\"",
                    "htmlLink": "https://www.google.com/calendar",
                    "iCalUID": "@google.com",
                    "id": "",
                    "kind": "calendar#event",
                    "organizer": {
                        "displayName": "Predictive",
                        "email": "@group.calendar.google.com",
                        "self": true
                    },
                    "reminders": {
                        "useDefault": true
                    },
                    "sequence": 1,
                    "start": {
                        "dateTime": "2020-11-10T17:30:00-05:00"
                    },
                    "status": "confirmed",
                    "summary": "Group call",
                    "updated": "2020-11-10T00:13:33.387Z"
                },
                {
                    "created": "2020-11-11T02:02:03.000Z",
                    "creator": {
                        "email": "@gmail.com"
                    },
                    "end": {
                        "dateTime": "2020-11-10T22:30:00-05:00"
                    },
                    "etag": "\"\"",
                    "htmlLink": "https://www.google.com/calendar/event",
                    "iCalUID": "@google.com",
                    "id": "",
                    "kind": "calendar#event",
                    "organizer": {
                        "displayName": "Predictive",
                        "email": "@group.calendar.google.com",
                        "self": true
                    },
                    "reminders": {
                        "useDefault": true
                    },
                    "sequence": 0,
                    "start": {
                        "dateTime": "2020-11-10T21:30:00-05:00"
                    },
                    "status": "confirmed",
                    "summary": "predictive part",
                    "updated": "2020-11-11T02:02:03.410Z"
                }
            ],
            "kind": "calendar#",
            "nextSyncToken": "-=",
            "summary": "Predictive",
            "timeZone": "America/Toronto",
            "updated": "2020-11-11T02:02:03.410Z"
        },
        {
            "accessRole": "owner",
            "defaultReminders": [],
            "description": "",
            "etag": "\"\"",
            "items": [
                {
                    "created": "2020-09-23T02:48:00.000Z",
                    "creator": {
                        "email": "@gmail.com"
                    },
                    "end": {
                        "date": "2020-11-10"
                    },
                    "etag": "\"\"",
                    "htmlLink": "",
                    "iCalUID": "@google.com",
                    "id": "",
                    "kind": "calendar#event",
                    "organizer": {
                        "displayName": "Real Estate",
                        "email": "@group.calendar.google.com",
                        "self": true
                    },
                    "reminders": {
                        "useDefault": false
                    },
                    "sequence": 3,
                    "start": {
                        "date": "2020-11-09"
                    },
                    "status": "confirmed",
                    "summary": "Assignment 3",
                    "updated": "2020-09-26T17:36:50.714Z"
                }
            ],
            "kind": "#events",
            "nextSyncToken": "=",
            "summary": "Real Estate",
            "timeZone": "America/Toronto",
            "updated": "2020-11-06T06:24:35.930Z"
        },
        {
            "accessRole": "owner",
            "defaultReminders": [],
            "etag": "\"\"",
            "items": [
                {
                    "created": "2020-09-30T19:24:53.000Z",
                    "creator": {
                        "email": "@gmail.com"
                    },
                    "end": {
                        "dateTime": "2020-11-10T02:00:00-05:00",
                        "timeZone": "America/Toronto"
                    },
                    "etag": "\"\"",
                    "htmlLink": "",
                    "iCalUID": "@google.com",
                    "id": "",
                    "kind": "calendar#event",
                    "organizer": {
                        "displayName": "Reading",
                        "email": "@group.calendar.google.com",
                        "self": true
                    },
                    "originalStartTime": {
                        "dateTime": "2020-11-10T01:00:00-05:00",
                        "timeZone": "America/Toronto"
                    },
                    "recurringEventId": "",
                    "reminders": {
                        "useDefault": true
                    },
                    "sequence": 0,
                    "start": {
                        "dateTime": "2020-11-10T01:00:00-05:00",
                        "timeZone": "America/Toronto"
                    },
                    "status": "confirmed",
                    "summary": "Reading",
                    "updated": "2020-09-30T19:24:53.912Z"
                }
            ],
            "kind": "calendar#events",
            "nextSyncToken": "=",
            "summary": "Reading",
            "timeZone": "America/Toronto",
            "updated": "2020-09-30T19:24:53.912Z"
        },
        {
            "accessRole": "owner",
            "defaultReminders": [],
            "etag": "\"\"",
            "items": [
                {
                    "created": "2020-11-11T00:09:57.000Z",
                    "creator": {
                        "email": "@gmail.com"
                    },
                    "end": {
                        "dateTime": "2020-11-10T20:30:00-05:00"
                    },
                    "etag": "\"\"",
                    "htmlLink": "",
                    "iCalUID": "@google.com",
                    "id": "",
                    "kind": "calendar#event",
                    "organizer": {
                        "displayName": "ToDo",
                        "email": "@group.calendar.google.com",
                        "self": true
                    },
                    "reminders": {
                        "useDefault": true
                    },
                    "sequence": 0,
                    "start": {
                        "dateTime": "2020-11-10T19:30:00-05:00"
                    },
                    "status": "confirmed",
                    "summary": "",
                    "updated": "2020-11-11T00:09:57.152Z"
                }
            ],
            "kind": "calendar#events",
            "nextSyncToken": "-=",
            "summary": "ToDo",
            "timeZone": "America/Toronto",
            "updated": "2020-11-11T00:09:57.152Z"
        },
        {
            "accessRole": "owner",
            "defaultReminders": [
                {
                    "method": "popup",
                    "minutes": 30
                }
            ],
            "etag": "\"\"",
            "items": [
                {
                    "created": "2020-09-29T03:29:51.000Z",
                    "creator": {
                        "email": "@gmail.com",
                        "self": true
                    },
                    "end": {
                        "dateTime": "2020-11-10T14:30:00-05:00",
                        "timeZone": "America/Toronto"
                    },
                    "etag": "\"\"",
                    "htmlLink": "",
                    "iCalUID": ".com",
                    "id": "",
                    "kind": "calendar#event",
                    "organizer": {
                        "email": "@gmail.com",
                        "self": true
                    },
                    "originalStartTime": {
                        "dateTime": "2020-11-10T11:30:00-05:00",
                        "timeZone": "America/Toronto"
                    },
                    "recurringEventId": "",
                    "reminders": {
                        "useDefault": true
                    },
                    "sequence": 0,
                    "start": {
                        "dateTime": "2020-11-10T11:30:00-05:00",
                        "timeZone": "America/Toronto"
                    },
                    "status": "confirmed",
                    "summary": "ENTR 4700",
                    "updated": "2020-09-29T03:29:51.740Z"
                },
                {
                    "created": "2020-11-10T05:39:09.000Z",
                    "creator": {
                        "email": "@gmail.com",
                        "self": true
                    },
                    "end": {
                        "dateTime": "2020-11-10T11:30:00-05:00"
                    },
                    "etag": "",
                    "htmlLink": "",
                    "iCalUID": "@google.com",
                    "id": "",
                    "kind": "calendar#event",
                    "organizer": {
                        "email": "@gmail.com",
                        "self": true
                    },
                    "reminders": {
                        "useDefault": true
                    },
                    "sequence": 1,
                    "start": {
                        "dateTime": "2020-11-10T10:30:00-05:00"
                    },
                    "status": "confirmed",
                    "summary": "Pick a term sheet ",
                    "updated": "2020-11-10T05:39:12.662Z"
                }
            ],
            "kind": "calendar#events",
            "nextSyncToken": "=",
            "summary": "ENTR 4700",
            "timeZone": "America/Toronto",
            "updated": "2020-11-10T06:12:07.093Z"
        },
        {
            "accessRole": "owner",
            "defaultReminders": [],
            "etag": "\"\"",
            "items": [],
            "kind": "calendar#events",
            "nextSyncToken": "=",
            "summary": "Programming",
            "timeZone": "America/Toronto",
            "updated": "2020-11-08T01:45:49.847Z"
        },
        {
            "accessRole": "owner",
            "defaultReminders": [],
            "etag": "\"\"",
            "items": [],
            "kind": "calendar#events",
            "nextSyncToken": "",
            "summary": "Alexa",
            "timeZone": "America/Toronto",
            "updated": "2020-11-08T16:37:12.291Z"
        }
    ]

    print(type(AllCals))
    <class 'list'>

不幸的是,google 的日历 API 不提供用户的所有事件,即使 "CalendarId" 已设置 to 'primary' which has been an issue amongst developers。所以,只好把用户的每个日历都提取出来,合并,再解析。

最终目标:从日历中检索用户的事件持续时间。

events = events_result.get('items', [])
Ids = [item['id'] for item in events]
AllCals = [service.events().list(calendarId=id, timeMin=yesterdayy, timeMax = utc_dt,singleEvents=True,orderBy='updated').execute() for id in Ids ]

您显示的示例数据似乎是 JSON,但我假设您有一个字典列表,每个字典都有一个键“items”,包含一组日历项,每个日历项都有键“开始”和“结束”,每个都包含一个字典,其中包含一个包含 ISO 日期字符串的键“日期”或“日期时间”。

我仍然不知道你要用它做什么,但如果我理解正确的话,你想要检索所有日历项目的持续时间。

from datetime import datetime

# AllCals = ...

for calendar in AllCals:
    for item in calendar["items"]:
        # this could probably be done more elegantly. you basically want item["start"]["date"] or item["start"]["dateTime"], whichever is present
        item_start = item["start"]
        item_start_string = item_start["date"] if "date" in item_start else item_start["dateTime"]
        start_datetime = datetime.fromisoformat(item_start_string)

        item_end = item["end"]
        item_end_string = item_end["date"] if "date" in item_end else item_end["dateTime"]
        end_datetime = datetime.fromisoformat(item_end_string)

        duration = end_datetime - start_datetime
        print(f"{item['summary']}: {duration}")

使用您的示例数据,将打印:

Group call: 1:00:00
predictive part: 1:00:00
Assignment 3: 1 day, 0:00:00
Reading: 1:00:00
: 1:00:00
ENTR 4700: 3:00:00
Pick a term sheet : 1:00:00