代码之家  ›  专栏  ›  技术社区  ›  Vasanth Raghavan

修改json-使用python删除json结构中的某些元素

  •  0
  • Vasanth Raghavan  · 技术社区  · 7 年前

    我的json结构如下:

    "AGENT": {
        "pending": [],
        "active": null,
        "completed": [
            **{
                "result": {
                    "job1.AGENT": "SUCCESS",
                    "job2.AGENT": "SUCCESS"
                },
                "return_value": {
                    "job1.AGENT": "",
                    "job2.AGENT": ""
                },
                "visible": true,
                "global": true,
                "locale": [
                    "en_US"
                ],
                "complete_time": "2018-01-24T17:44:33.484Z",
                "persist": true,
                "type": "script",
                "script": "<script_name>.py",
                "preset_status": "CONFIGURING",
                 "parameters": {},
                "submit_time": "2018-01-24T17:44:26.747Z"
            }**,
            {
                "result": {
                    ..
                },
                "return_value": {
                    ..
                },
                "visible": true,
                "global": true,
                "locale": [
                    "en_US"
                ],
                "complete_time": "2018-04-2T17:44:40.049Z",
                 "submit_time": "2018-04-2T17:44:26.817Z"
            }
    

    我需要根据完成时间删除整个结果块,比如在2018-04-03之前删除结果块

    我怎么能用python实现呢?

    到目前为止,我已经尝试了以下几点:

         json_data = json.dumps(data) 
         item_dict = json.loads(data)
         print item_dict["AGENT"]["completed"][0]["complete_time"]
    

    这是完整的时间。但是我的问题是“代理”不是一个常量字符串。弦可以变化。另外,我还需要找出基于完成时间删除整个json块的逻辑

    1 回复  |  直到 7 年前
        1
  •  1
  •   Serge Ballesta    7 年前

    好吧,我假设您能够正确地将json加载到python措辞中,让我们调用它 item_dict ,但键可能不同。

    现在您需要它进入那个python对象,并解码 complete_time 字段。不幸的是,python strptime 不知道 Z 时区,所以我们必须跳过最后一个字符。

    另外,在迭代集合对象时,不应修改该对象,因此防弹方法是存储要删除的索引,然后再将其删除。代码可以是:

    datelimit = datetime.datetime(2018, 4, 1)       # limit date for completed_time
    to_remove = []
    dateformat = '%Y-%m-%dT%H:%M:%S.%f'
    for k, v in item_dict.items():                  # enumerate top_level objects
        for i, block in enumerate(v['completed']):  # enumerate inner blocks
            complete_time = datetime.datetime.strptime(   # skip last char from complete_time
                block["complete_time"][:-1], dateformat)
            # print(k, i, complete_time)              # uncomment for tests
            if complete_time < datelimit:           # too old
                to_remove.append((k, i))            # store the index for later processing
    
    for k, i in reversed(to_remove):           # start from the end to keep consistent indices
        del item_dict[k]["completed"][i]       # actual deletion