我的json文件看起来像这样:
[{'Events': [{'EventName': 'Log',
'EventType': 'Native',
'LogLevel': 'error',
'Message': 'missing event: seqNum=1'},
{'EventName': 'Log',
'EventType': 'Native',
'LogLevel': 'error',
'Message': 'missing event: seqNum=2'}],
'Id': 116005},
{'Events': [{'EventName': 'Log',
'EventType': 'Native',
'LogLevel': 'error',
'Message': 'missing event: seqNum=101'},
{'EventName': 'Log',
'EventType': 'Native',
'LogLevel': 'error',
'Message': 'missing event: seqNum=102'},
{'BrowserInfo': {'name': 'IE ', 'version': '11'},
'EventName': 'Log',
'EventType': 'Native',
'LogLevel': 'info',
'SeqNum': 3,
'SiteID': 1454445626890,
'Time': 1454445626891,
'URL': 'http://test.com'},
{'BrowserInfo': {'name': 'IE ', 'version': '11'},
'EventName': 'eventIndicator',
'EventType': 'responseTime',
'SeqNum': 8,
'SiteID': 1454445626890,
'Time': 1454445626923,
'URL': 'http://test.com'}],
'Id': 116005}]
我正在尝试删除"EventName": "Log"
。
我认为有一种方法可以pop
出来,但我甚至无法在列表中进行足够多的迭代来完成这项工作。最干净的方法是什么?
我应该得到一个看起来像的列表:
[{'Events': [{'BrowserInfo': {'name': 'IE ', 'version': '11'},
'EventName': 'eventIndicator',
'EventType': 'responseTime',
'SeqNum': 8,
'SiteID': 1454445626890,
'Time': 1454445626923,
'URL': 'http://test.com'}],
'Id': 116005}]
答案 0 :(得分:0)
当您迭代它时,很难修改列表或其他数据结构。创建新的数据结构通常更容易,不包括不需要的值。
您似乎想要做两件事:
"Events"
"EventName"
"Log"
列表中删除词典。"Log"
事件被删除后,事件列表变空的所有顶级词典。一次做这两件事有点棘手,但不是太糟糕:
filtered_json_list = []
for event_group in json_list:
filtered_events = [event for event in event_group["Events"]
if event["EventName"] != "Log"]
if filtered_events: # skip empty event groups!
filtered_json_list.append({"Id": event_group["Id"], "Events": filtered_events})
这比我预期的要容易得多,因为顶级词典(我称之为event_group
,因为缺少更好的名称)只有两个键,"Id"
和{{1} }。相反,如果这些词典中有许多键和值(或者它们具有哪些键和值是不可预测的),您可能需要用更复杂的东西替换我的代码的最后一行(例如,仅使用过滤的事件创建字典) ,然后使用一种循环来复制所有非"Events"
键和值),而不是用文字手工创建字典。
答案 1 :(得分:0)
此计划可能有所帮助。
import json
# Parse the JSON
with open('x.json') as fp:
events = json.load(fp)
# Kill all "Log" events
for event_set in events:
event_list = event_set['Events']
event_list[:] = [event for event in event_list if event['EventName'] != 'Log']
# Kill all empty event sets
events[:] = [event_set for event_set in events if event_set['Events']]
print json.dumps(events, indent=2)
答案 2 :(得分:-1)
您可以在此
中使用Python生成器/列表编译器 [x for x in json where x['EventName'] != 'Log']