2013-03-13 76 views
0

我有一個json文件,看起來像這樣: 我將不得不提取事件,例如。 'APP_STARTED''ORIENTATION'等json使用字典解析

{u'ParamElement_ReceivedTime': u'2012-11-02-00-05-31-748', 
u'ParamElement_Name': u'LOG_CONTENT', 
u'ParamElement_Info_0': 
       {u'dict': 
         {u'Events_list': [ 
          { 
          u'Event': u'APP_STARTED', 
          u'time': u'2012-11-01 20:00:59.565 -0400'}, 
          { 
          u'time': u'2012-11-01 20:01:01.168 -0400', 
          u'Event': u'ORIENTATION', 
          u'Orientation': u'Portrait'}, 

          {u'Event': u'CLIENT_RESULT_RECEIVED', 
          u'time': u'2012-11-01 20:01:15.927 -0400'}, 

          {u'Prev_SessionID': u'802911CC329E47139B61B58E21BF2FFF', 
          u'Prev_TransactionID': u'2', 
          u'Tab_Index': u'5', 
          u'time': u'2012-11-01 20:01:15.941 -0400', 
          u'Event': u'RESOLVED_TAB', 
          u'Accuracy': u'5.000000'}, 

          {u'Prev_TransactionID': u'2', 
          u'Prev_SessionID': u'802911CC329E47139B61B58E21BF2FFF', 
          u'Event': u'CLIENT_RESULT_RECEIVED', 
          u'time': u'2012-11-01 20:01:16.568 -0400'} 
        } 

整件事存儲在一個名爲event_dict的變量中。 我有一個看起來像代碼:

if event_dict: 
     if 'dict' in event_dict['ParamElement_Info_0']: 
      if 'el' in event_dict['ParamElement_Info_0']['dict']: 
      if 'e' in event_dict['ParamElement_Info_0']['dict']['el']: 
      print e['Event'] 

可能是什麼錯誤呢?

+0

* *什麼錯誤?你得到什麼錯誤或不正確的行爲? – 2013-03-13 16:34:46

+0

沒有錯誤。我試圖打印字典,它是空的。 – user1189851 2013-03-13 16:35:19

回答

3

Python的方法是請求原諒,而不是許可,並且使用try-catch塊代替condition checks更容易和更好,除非condition fail必須單獨處理。

try: 
    event = event_dict['ParamElement_Info_0']['dict']['Events_list'] 
except Exception, e: 
    log('Opsss, incorrect data format: %s' % e.message) 

以這種方式,你可以很容易地看到你的錯誤。

2

你從來沒有定義變量e:你的最後一行應該是一個循環,條件,如較早線:

for e in event_dict['ParamElement_Info_0']['dict']['el']: 
    print e 

另外,我覺得你說"el"當你需要說"Events_list" ,使您糾正代碼:

if event_dict: 
     if 'dict' in event_dict['ParamElement_Info_0']: 
      if 'Events_list' in event_dict['ParamElement_Info_0']['dict']: 
       for e in event_dict['ParamElement_Info_0']['dict']['Events_list']: 
        print e 
+0

是的,我使用el作爲Events_list – user1189851 2013-03-13 16:37:42

+1

你是什麼意思你「使用el」?字典中的字符串名稱是'Events_list'。您正在檢查該字符串是否在您的字典中。你不能檢查一個完全不同的字符串。你是否認爲它是一個for循環,比如'for event_dict ...'中的el? – 2013-03-13 16:38:47

+0

對不起,我是在event_dict中的el的意思......我沒有把它改回event_list。感謝指針。 – user1189851 2013-03-13 16:48:43

2

字典中沒有'el'元素。當你編寫一個for A in B時,你正在創建一個變量A來保存迭代器B的內容。你在做什麼就是說,如果'el'鍵在我的字典中......那不是。但是Events_list正如@David指出的那樣。

以下是可能更簡單的方法。

def item_getter(struct, key): 
    parts = key.split('.', 1) 
    if len(parts) > 1: 
     key_part, rest_part = parts 
     return item_getter(struct.get(key_part, {}), rest_part) 
    return struct.get(key, None) 

items = item_getter(event_dict, "ParamElement_Info_0.dict.Events_list") 
events = [item.get('Event', 'No Event') for item in items] 
print events 

輸出

[u'APP_STARTED', u'ORIENTATION', u'CLIENT_RESULT_RECEIVED', u'RESOLVED_TAB', u'CLIENT_RESULT_RECEIVED'] 
+0

謝謝@sberry。 – user1189851 2013-03-26 15:20:18