2013-03-13 77 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