如何从dictionary/json中只提取特定字段



我正试图创建一个新的字典来只提取特定的字段,我只想要"process_hash"process_name"process_effective_repution";字段。

下面的代码可以工作,但它只提取第一个项目,我想提取所有项目,但只提取";process_hash"process_name"process_effective_repution";字段

JSON:

{'results': [{'device_name': 'faaadc2',
'device_timestamp': '2020-10-27T00:50:46.176Z',
'event_id': '9b1bvfaa11eb81b',
'process_effective_reputation': 'LIST5',
'process_hash': ['bfc7dcf5935f3avda9df8e9b6425c37a',
'ca9f3a2450asd518fc939a33c100b2d557f96e040f712f6dd4641ad1734e2f19'],
'process_name': 'c:\program files '
'(x86)\to122soft\thcaadf3\tohossce.exe',
'process_username': ['JOHN\user1']},
{'device_name': 'fk6saadc2',
'device_timestamp': '2020-10-27T00:50:46.176Z',
'event_id': '9b151f6e17ee11eb81b',
'process_effective_reputation': 'LIST1',
'process_hash': ['bfc7dcf5935f3a9df8e9baaa425c37a',
'ca9f3aaa506cc518fc939a33c100b2d557f96e040f712f6dd4641ad1734e2f19'],
'process_name': 'c:\program files '
'(x86)\oaaft\tf3\toaaotsice.exe',
'process_username': ['JOHN\user2']},
{'device_name': 'sdddsdc2',
'device_timestamp': '2020-10-27T00:50:46.176Z',
'event_id': '9b151f698e11eb81b',
'process_effective_reputation': 'LIST',
'process_hash': ['9df8ebfc7dcf5935830f3a9b6asdcd7a',
'ca9f3a24506cc518fdfrcv39a33c100b2d557f96e040f7124641ad1734e2f19'],
'process_name': 'c:\program files '
'(x86)\toht\thaa3\toasce.exe',
'process_username': ['JOHN\user3']}]}

代码:

response = json.loads(r.text)
r = response['results']
selected_fields = []
for d in r:
selected_fields.append({k: d[k] for k in ("process_hash", "process_name", "process_effective_reputation")})
new_data = []
for data in selected_fields:
fieldnames = 'md5 sha256 process_name process_effective_reputation'.split()
row = {'md5': data['process_hash'][0], 'sha256': data['process_hash'][1]}
# Copy process_name and process_effective_reputation fields.
row.update({fieldname: data[fieldname] for fieldname in fieldnames[-2:]})
new_data.append(row)
return new_data

更新:

感谢Lauren Boland的代码,这很有效,感谢Nattelar的解释。

我已经附上了新的代码,我正试图将进程哈希字段拆分为两个字段,这样它就是";md5"sha256"进程名称"process_effective_repution";,我试过上面的代码,但我得到了row={'md5':data['process_hash'][0],'sha256':data['process_hash'][1]}IndexError:列出超出范围的索引

谢谢

您在for循环的每次迭代中都覆盖了selected_fields字典。

试着把它列成一个列表。它将返回一个字典列表。

selected_fields = []
for d in r:
selected_fields.append({k: d[k] for k in ("process_hash", "process_name", "process_effective_reputation")})
return selected_fields

尽管已经有了答案,但我想指出这里发生了什么。

当你试图使变量等于时,你最终会覆盖之前的值,这就是为什么你的代码不能工作的原因。但是,即使您尝试使用useselected_fields.update((,它也不会起作用,因为键的名称是相同的,现在键的值将被覆盖。

在做这种事情时,你通常必须保持结构的原始类型,在selected_fields[‘Results’]的情况下,它是一个列表

最新更新