繁体   English   中英

如何在Python中为嵌套JSON对象重命名键

[英]How to rename key for nested JSON object in Python

执行Logstash聚合后,我有此JSON对象响应。

 "aggregations": {
    "range": {
      "buckets": [
        {
          "key": "2018-01-01T00:00:00.000Z-2018-01-31T00:00:00.000Z",
          "from_as_string": "2018-01-01T00:00:00.000Z",
          "to_as_string": "2018-01-31T00:00:00.000Z",
          "doc_count": 13000,
          "by ip": {
            "doc_count_error_upper_bound": 10,
            "sum_other_doc_count": 10300,
            "buckets": [
              {
                "key": "192.168.0.1",
                "doc_count": 20 <---
                 .
                 .
                 . (Sub-buckets for other fields containing doc_count as 
                    well)
              },
              {
                "key": "1.2.3.4",
                "doc_count": 50 <---
              }
            }
          ]
        }
      }
    ]
  }
}

我想将“ doc_count”键重命名为“唯一事件数”。 但是,我只希望这仅用于IP地址存储段的doc_count,而不是其他任何存储段字段。

这是我找到的解决方案之一,但是它为每个字段存储区都重命名了doc_count。

def rename_doc_count(obj):
    for key in obj.keys():
        new_key = key.replace("doc_count","Number of unique events")
        if new_key != key:
            obj[new_key] = obj[key]
            del obj[key]
    return obj

new_json = json.loads(jres, object_hook=rename_doc_count)

有人有适合我情况的解决方案吗? 谢谢!

在加载JSON之后执行此操作,以便可以仅在所需元素上调用该函数。

obj = json.loads(jres);
for bucket in obj["aggregations"]["range"]["buckets"]:
    for bucket2 in bucket["by ip"]["buckets"]:
        rename_doc_count(bucket2)

并且无需在rename_doc_count循环,只需获取特定的字典元素即可。

def rename_doc_count(obj):
    if "doc_count" in obj:
        obj["Number of unique events"] = obj["doc_count"]
        del obj["doc_count"]

您提到,可能有一些子存储桶也应重命名。 您可以通过rename_doc_count递归调用自身来实现。 但是您没有显示它们在结构中的位置,因此我不确切知道它的外观。 但这类似于json.loads()之后的循环。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM