将 JSON 转换为 .ics (Python)

Convert JSON to .ics (Python)

我正在尝试将 JSON 文件转换为 iCalendar 文件。我的主管建议使用两个函数 convertTo(data)(将 JSON 转换为字符串)和 convertFrom(data)(将字符串转换为 JSON;我不确定这样做的目的功能)。

我目前的方法使用了很多重构和多个函数。

#returns a String
def __convert(data):
    convStr = __convertTo(data)
    convStr = __fields(convStr)
    return convStr

#convert JSON to a String
def __convertTo(data):
    str = "" + data
    return str

#takes string arg (prev converted from JSON) to split it into useful info
def __fields(data)
    #########
    iCalStr = __iCalTemplate(title, dtStart, UID, remType, email)
    return iCalStr

#
def __iCalTemplate(title, dtStart, UID, remType, email):
    icsTempStr = "BEGIN:VEVENT\n
                  DTSTART:" + dtStart + "\nUID:" + UID + "\nDESCRIPTION:" + desc + "\nSUMMARY:" + title
    if remType is not None
        icsTempStr += "\nBEGIN:VALARM\nACTION:" + remType + "DESCRIPTION:This is an event reminder"
        if remType is email
            icsTempStr += "\nSUMMARY:Alarm notification\nATTENDEE:mailto:" + email
        icsTempStr += "\nEND:VALARM"
return icsTempStr

任何提示或建议都会很有帮助。我完全知道这段代码需要大量工作。

这不是一个完整的答案,而是一个更长的提示。

有一个 Python 习语对您构建字符串非常有帮助,尤其是潜在的大字符串。看例子可能比解释更容易:

>>> template = 'a value: {a}; b value: {b}'
>>> data = {'a': 'Spam', 'b': 'Eggs'}
>>> template.format(**data)
'a value: Spam; b value: Eggs'

与字符串连接相比,这个习惯用法有许多优点,如果您正确编写模板,可以完全消除对函数的需要。例如,可选的插入可以被赋予 '' 的值。正确格式化 iCal 模板后,只需从 JSON 检索正确的数据点...如果您将模板插入点命名为与 JSON 中相同的名称,您可能甚至能够一步完成这种转换。通过一些计划,您的最终答案可能很简单:

import json
template = 'full iCal template with {insert_point} spec goes here'
data = json.JSONDecoder().decode(your_json_data)
ical = template.format(**data)

做一个快速(略有不同)的解释器示例:

>>> import json
>>> decoder = json.JSONDecoder()
>>> json_example = '{"item_one" : "Spam", "item_two" : "Eggs"}'
>>> template = 'Item 1: {item_one}\nItem 2: {item_two}'
>>> print template.format(**decoder.decode(json_example))
Item 1: Spam
Item 2: Eggs

我最终使用了一种完全不同的、更有效的方法来完成这项工作。总之,我的方法遍历 JSON,从每个字段中提取每个值并手动将其放置在 iCalendar 模板中的适当位置。它 returns 一个字符串。像这样...

def convert(self, json):
    template = 'BEGIN:VEVENT\n'
    template += 'DTSTART:%s\n' % json['event-start']
    ...
    return template