Как извлечь только определенные поля из словаря / json?

#python #json

#python #json

Вопрос:

Я пытаюсь создать новый словарь для извлечения только определенных полей, мне нужны только поля «process_hash», «process_name», «process_effective_reputation».

Приведенный ниже код работает, но он извлекает только первый элемент, я хотел бы извлечь все элементы, но только для полей «process_hash», «process_name», «process_effective_reputation»

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
  

Обновить:

спасибо Лорен Боланд за код, это сработало, и Наттелар за объяснение.

я прикрепил новый код, я пытаюсь разделить поля хэша процесса на два поля, чтобы это было «md5» «sha256» «имя_процесса» «process_effective_reputation», я пробовал приведенный выше код, но я получаю row = {‘md5’: data[‘process_hash’][0], ‘sha256’: data[‘process_hash’][1]} Ошибка индекса: список индексов вне диапазона

Спасибо

Ответ №1:

Вы перезаписывали selected_fields словарь на каждой итерации вашего цикла for.

Попробуйте вместо этого сделать это списком. Он вернет список словарей.

 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
  

Комментарии:

1. я прикрепил новый код, я пытаюсь разделить поля хэша процесса на два поля, чтобы это было «md5» «sha256» «имя_процесса» «process_effective_reputation», я пробовал приведенный выше код, но я получаю row = {‘md5’: data[‘process_hash’][0], ‘sha256’: data[‘process_hash’][1]} Ошибка индекса: список индексов вне диапазона

Ответ №2:

Несмотря на то, что ответ уже есть, я хочу указать, что здесь происходит.

Когда вы пытаетесь сделать переменную равной чему-то, вы в конечном итоге перезаписываете значение, которое было там раньше, поэтому ваш код не работает. Но даже если вы попытаетесь использовать use selected_fields.update(), это не сработает, потому что имена ключей совпадают, и теперь значения ключей будут перезаписаны.

При выполнении подобных действий вам обычно приходится поддерживать исходный тип структуры, который в случае selected_fields[‘Results’] представляет собой список