执行 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()
.
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句