2015-03-31 120 views
0

我試圖將JSON文件轉換爲iCalendar文件。我的主管建議使用兩個函數convertTo(data)(將JSON轉換爲String)和convertFrom(data)(將String轉換爲JSON;我不確定此函數的用途)。將JSON轉換爲.ics(Python)

我目前的方法使用了很多重構和多重功能。

#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 

任何提示或建議將是非常有益的。我完全知道這個代碼需要很多工作。

+0

這個問題可以通過增加一個例子變得更加清晰;你想轉換爲什麼ics輸出的JSON對象? – Joost 2015-03-31 21:55:41

+0

您是否要求提供代碼建議,或者您是否有具體的錯誤消息或不當行爲?你的代碼是否被編譯? – 2015-03-31 22:28:43

+0

很難確切知道你在這裏做什麼......但__fields()接受一個數據參數,然後不做任何事情。它調用__iCalTemplate幾個參數,這些參數在您所包含的代碼中沒有定義。 __iCalTemplate()是否對某些測試數據有效?如果是這樣,請發佈測試數據和JSON數據的示例。如果不是......先解決這個問題。 – dylrei 2015-03-31 23:17:30

回答

1

這不是一個完整的答案,而是一個較長的提示。

有一個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 
+0

我試圖實現這種方法,而不是我之前做的事情,但是在解碼()方面遇到了很多麻煩。當我嘗試json.decode()時,我收到一條錯誤消息,說'模塊'對象沒有屬性'解碼'。當我嘗試json.JSONDecoder()。decode()時,我得到一個錯誤消息,讀取「/usr/lib/python2.7/json/decoder.py,行366 end = self.raw_decode(s,idx = _w(s ,o).end()); TypeError:期望的字符串或緩衝區,不知道如何解釋最後一個。 – 2015-04-02 19:26:32

+0

對不起...... decode()是JSONDecoder對象的一個​​方法,我將更新答案並提供一個簡單的例子。 – dylrei 2015-04-04 16:59:18

1

我最終使用了完全不同的,更有效的方法來完成這一點。總之,我的方法遍歷JSON,從每個字段中提取每個值並手動將它放在iCalendar模板的適當位置。它返回一個字符串。像這樣的東西...

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