json使用字典解析
我有一个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']
可能是什么错误呢?
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)
以这种方式,你可以很容易地看到你的错误。
你从来没有定义变量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
是的,我使用el作为Events_list – user1189851 2013-03-13 16:37:42
你是什么意思你“使用el”?字典中的字符串名称是'Events_list'。您正在检查该字符串是否在您的字典中。你不能检查一个完全不同的字符串。你是否认为它是一个for循环,比如'for event_dict ...'中的el? – 2013-03-13 16:38:47
对不起,我是在event_dict中的el的意思......我没有把它改回event_list。感谢指针。 – user1189851 2013-03-13 16:48:43
字典中没有'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']
谢谢@sberry。 – user1189851 2013-03-26 15:20:18
* *什么错误?你得到什么错误或不正确的行为? – 2013-03-13 16:34:46
没有错误。我试图打印字典,它是空的。 – user1189851 2013-03-13 16:35:19