Преобразование вложенных Json в одну пару значений ключа - PullRequest
0 голосов
/ 01 августа 2020

У меня есть список ключей:

  1. Сервер
  2. Дата
  3. Уровень серьезности
  4. процесс
  5. сообщение

Если в моем Словаре есть ключ «events», мне нужно заменить ключ на «Message», и значение «indicator-type» станет значением сообщения

List1=[
      {
        "server": "10.10.0.123",
        "date": 1561994754,
        "severity": "INFO",
        "process": "webapp",
        "message": "server started."
      },
      {
        "server": "10.10.0.202",
        "date": 1561994757000,
        "source": "jvm-x994a",
        "events": [{               
            "indicator-type": "memory-low"
          }]
      },
    
      {
        "server": "10.10.0.202",
        "date": 1561994773000,
        "source": "jvm-x994a",
        "events": [{              
            "indicator-type": "memory-low"
            }
            ]
      }
    
    ]

Ожидаемый результат:

 List1=[
          {
            "server": "10.10.0.123",
            "date": 1561994754,
            "severity": "INFO",
            "process": "webapp",
            "message": "server started."
          },
          {
            "server": "10.10.0.202",
            "date": 1561994757000,
            "source": "jvm-x994a",
            "message": "memory-low"
              
          },
        
          {
            "server": "10.10.0.202",
            "date": 1561994773000,
            "source": "jvm-x994a",
            "message": "memory-low"
                }
                ]
          }
        
        ]

Пока что я пробовал: в приведенном ниже коде я пытаюсь проверить наличие клавиши «события» и заменить ее клавишей «сообщение», но когда я я печатаю, это не заменяет их ключ-значение

output = []
d={}
for x in a:
        d['server']=x['server']
        if (str(x['date']).isdigit() == True):
            d['date'] =2
            # datetime.datetime.fromtimestamp(x['date'] / 1000.0).strftime('%Y-%m-%d %H:%M:%S.%f')

        if ("events" in x):
            for i in (x['events']):
                if (i['indicator-level'] == 3):
                    d['severity'] = "INFO"
                if (i['indicator-level'] == 7):
                    d['severity'] = "WARN"
                if (i['indicator-type'] != None):
                    d['message'] = i['indicator-type'] 

Ответы [ 2 ]

0 голосов
/ 01 августа 2020

Прежде чем перейти к следующему шагу, очистите словарь.

def handle_events_key(dict_):
    """
    Adds a new 'message' key to 'dict_' based on 'events' key.
    Returns a new dictionary without the 'events' key.
    """

    if 'events' in dict_:
        dict_['message'] = dict_['events'][0]['indicator-type']

    return {key: value for key, value in dict_.items() if key != 'events'}

def events_key_to_message(list_):
    return [handle_events_key(dict_) for dict_ in list_]

# Usage
# List1 = ...

# Cleaning out the dictionary.
ListUpdated = events_key_to_message(List1)
0 голосов
/ 01 августа 2020

Попробуйте это. Я изменил элементы управления events.

output = []

for item in List1:
    
    d = {}
    
    d['server'] = item['server']
    
    if (str(item['date']).isdigit() == True): 
        d['date'] =2
        # datetime.datetime.fromtimestamp(x['date'] / 1000.0).strftime('%Y-%m-%d %H:%M:%S.%f')

    # get will give you None and not raise an exception if there is no events key.
    if item.get('events') is not None:
        for event in item['events']:
            if event.get('indicator-level') == 3: d['severity'] = "INFO"
            if event.get('indicator-level') == 7: d['severity'] = "WARN"
            if event.get('indicator-type') is not None: d['message'] = event['indicator-type'] 

    output.append(d)

print(output)


# [{'server': '10.10.0.123', 'date': 2}, {'server': '10.10.0.202', 'date': 2, 'message': 'memory-low'}, {'server': '10.10.0.202', 'date': 2, 'message': 'memory-low'}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...