【问题标题】:How to rename key for nested JSON object in Python如何在 Python 中重命名嵌套 JSON 对象的键
【发布时间】:2019-04-11 15:25:01
【问题描述】:

在执行 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)

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

【问题讨论】:

    标签: python elasticsearch logstash


    【解决方案1】:

    在加载 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()之后的循环。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-16
      • 1970-01-01
      • 1970-01-01
      • 2021-02-15
      • 1970-01-01
      • 2019-01-19
      • 2020-11-12
      • 1970-01-01
      相关资源
      最近更新 更多