首页 > 解决方案 > 将嵌套的 Json 转换为单个键值对

问题描述

我有一个 Keys 列表:

  1. 服务器
  2. 日期
  3. 严重性
  4. 过程
  5. 信息

如果我的 Dictionary 中有键“events”,我需要将键替换为“Message”,“indicator-type”的值将成为 message 的值

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'] 

标签: python-3.xdictionary

解决方案


尝试这个。我已经修改了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'}]

推荐阅读