如何使用python从icalendar文件创建一个json数组?

时间:2016-11-23 17:08:49

标签: python arrays json parsing icalendar

我有一个文件,我希望使用python以json数组格式读取。我发现有一个名为icalendar 3.11的软件包,但它并没有将iCalendar文本转换为json数组格式。

请参阅下面的icalendar文字:

BEGIN:VCALENDAR
PRODID;X-RICAL-TZSOURCE=TZINFO:-//Airbnb Inc//Hosting Calendar 0.8.8//EN
CALSCALE:GREGORIAN
VERSION:2.0
BEGIN:VEVENT
DTEND;VALUE=DATE:20161111
DTSTART;VALUE=DATE:20161110
UID:-4sxkntmd7ehk-4ybn124l9iwr@bnbhome.com
DESCRIPTION:CHECKIN: 11/10/2016\nCHECKOUT: 11/11/2016\nNIGHTS: 1\nPHONE: 
 +1 (111) 111-1111\nEMAIL: gregory-66i5v1thmkdva1u4@test.bnb.com\nPRO
 PERTY: Rittenhouse Square Cozy Studio Apartment\n
SUMMARY:John Smith (XXXXXX)
LOCATION:Rittenhouse Square Cozy Studio Apartment
END:VEVENT
BEGIN:VEVENT
DTEND;VALUE=DATE:20170104
DTSTART;VALUE=DATE:20170102
UID:-4sxkntmd7ehk-wps9gpnpzxkj@bnbhome.com
DESCRIPTION:CHECKIN: 01/02/2017\nCHECKOUT: 01/04/2017\nNIGHTS: 2\nPHONE: 
 +1 (222) 222-2222\nEMAIL: darren-3rntph9q5fqzbao2@test.bnb.com\nPROP
 ERTY: Rittenhouse Square Cozy Studio Apartment\n
SUMMARY:Abe Lincoln (XXXXXX)
LOCATION:Rittenhouse Square Cozy Studio Apartment
END:VEVENT
END:VCALENDAR

利用iCalendar Package here,我尝试了以下内容:

from icalendar import Calendar

result = Calendar().from_ical(ical_content)

结果

VCALENDAR({u'CALSCALE': vText('GREGORIAN'), u'VERSION': vText('2.0'), u'PRODID': vText('-//Airbnb Inc//Hosting Calendar 0.8.8//EN')}, VEVENT({u'LOCATION': vText('Rittenhouse Square Cozy Studio Apartment'), u'DESCRIPTION': vText('CHECKIN: 11/10/2016\nCHECKOUT: 11/11/2016\nNIGHTS: 1\nPHONE: +1 (111) 111-1111\nEMAIL: gregory-66i5v1thmkdva1u4@test.bnb.com\nPROPERTY: Rittenhouse Square Cozy Studio Apartment\n'), u'UID': vText('-4sxkntmd7ehk-4ybn124l9iwr@bnbhome.com'), u'DTEND': <icalendar.prop.vDDDTypes object at 0x1041e5610>, u'DTSTART': <icalendar.prop.vDDDTypes object at 0x1041e58d0>, u'SUMMARY': vText('John Smith (XXXXXX)')}),VEVENT({u'LOCATION': vText('Rittenhouse Square Cozy Studio Apartment'), u'DESCRIPTION': vText('CHECKIN: 01/02/2017\nCHECKOUT: 01/04/2017\nNIGHTS: 2\nPHONE: +1 (222) 222-2222\nEMAIL: darren-3rntph9q5fqzbao2@test.bnb.com\nPROPERTY: Rittenhouse Square Cozy Studio Apartment\n'), u'UID': vText('-4sxkntmd7ehk-wps9gpnpzxkj@bnbhome.com'), u'DTEND': <icalendar.prop.vDDDTypes object at 0x10441c690>, u'DTSTART': <icalendar.prop.vDDDTypes object at 0x10441c6d0>, u'SUMMARY': vText('Abe Lincoln (XXXXXX)')}))

如何将此icalendar文本转换为json数组?

1 个答案:

答案 0 :(得分:0)

非常讨厌的方式,但做的工作:

ical_content = """
BEGIN:VCALENDAR
PRODID;X-RICAL-TZSOURCE=TZINFO:-//Airbnb Inc//Hosting Calendar 0.8.8//EN
CALSCALE:GREGORIAN
VERSION:2.0
BEGIN:VEVENT
DTEND;VALUE=DATE:20161111
DTSTART;VALUE=DATE:20161110
UID:-4sxkntmd7ehk-4ybn124l9iwr@bnbhome.com
DESCRIPTION:CHECKIN: 11/10/2016\nCHECKOUT: 11/11/2016\nNIGHTS: 1\nPHONE:
 +1 (111) 111-1111\nEMAIL: gregory-66i5v1thmkdva1u4@test.bnb.com\nPRO
 PERTY: Rittenhouse Square Cozy Studio Apartment\n
SUMMARY:John Smith (XXXXXX)
LOCATION:Rittenhouse Square Cozy Studio Apartment
END:VEVENT
BEGIN:VEVENT
DTEND;VALUE=DATE:20170104
DTSTART;VALUE=DATE:20170102
UID:-4sxkntmd7ehk-wps9gpnpzxkj@bnbhome.com
DESCRIPTION:CHECKIN: 01/02/2017\nCHECKOUT: 01/04/2017\nNIGHTS: 2\nPHONE:
 +1 (222) 222-2222\nEMAIL: darren-3rntph9q5fqzbao2@test.bnb.com\nPROP
 ERTY: Rittenhouse Square Cozy Studio Apartment\n
SUMMARY:Abe Lincoln (XXXXXX)
LOCATION:Rittenhouse Square Cozy Studio Apartment
END:VEVENT
END:VCALENDAR
"""

import icalendar
from icalendar import Calendar

result = Calendar().from_ical(ical_content)

import json

r = []
for key, value in result.property_items():
    inner_d = {}
    if isinstance(value, icalendar.prop.vDDDTypes):
        inner_d[key] = value.dt.isoformat()
    else:
        inner_d[key] = value
    r.append(inner_d)

u = json.dumps(r, indent=4)
print(u)

输出是:

[
    {
        "BEGIN": "VCALENDAR"
    }, 
    {
        "VERSION": "2.0"
    }, 
    {
        "PRODID": "-//Airbnb Inc//Hosting Calendar 0.8.8//EN"
    }, 
    {
        "CALSCALE": "GREGORIAN"
    }, 
    {
        "BEGIN": "VEVENT"
    }, 
    {
        "SUMMARY": "John Smith (XXXXXX)"
    }, 
    {
        "DTSTART": "2016-11-10"
    }, 
    {
        "DTEND": "2016-11-11"
    }, 
    {
        "UID": "-4sxkntmd7ehk-4ybn124l9iwr@bnbhome.com"
    }, 
    {
        "CHECKOUT": " 11/11/2016"
    }, 
    {
        "DESCRIPTION": "CHECKIN: 11/10/2016"
    }, 
    {
        "EMAIL": " gregory-66i5v1thmkdva1u4@test.bnb.com"
    }, 
    {
        "LOCATION": "Rittenhouse Square Cozy Studio Apartment"
    }, 
    {
        "NIGHTS": " 1"
    }, 
    {
        "PHONE": "+1 (111) 111-1111"
    }, 
    {
        "PROPERTY": " Rittenhouse Square Cozy Studio Apartment"
    }, 
    {
        "END": "VEVENT"
    }, 
    {
        "BEGIN": "VEVENT"
    }, 
    {
        "SUMMARY": "Abe Lincoln (XXXXXX)"
    }, 
    {
        "DTSTART": "2017-01-02"
    }, 
    {
        "DTEND": "2017-01-04"
    }, 
    {
        "UID": "-4sxkntmd7ehk-wps9gpnpzxkj@bnbhome.com"
    }, 
    {
        "CHECKOUT": " 01/04/2017"
    }, 
    {
        "DESCRIPTION": "CHECKIN: 01/02/2017"
    }, 
    {
        "EMAIL": " darren-3rntph9q5fqzbao2@test.bnb.com"
    }, 
    {
        "LOCATION": "Rittenhouse Square Cozy Studio Apartment"
    }, 
    {
        "NIGHTS": " 2"
    }, 
    {
        "PHONE": "+1 (222) 222-2222"
    }, 
    {
        "PROPERTY": " Rittenhouse Square Cozy Studio Apartment"
    }, 
    {
        "END": "VEVENT"
    }, 
    {
        "END": "VCALENDAR"
    }
]

希望这有帮助:)