json - 使用python解析一个困难的json日志
问题描述
我有一个 json 文件,如下所示
{
"body": {
"results": [
[
{
"field": "@timestamp",
"value": "2020-04-26 19:28:40.136"
},
{
"field": "@message",
"value": "Hi"
},
{
"field": "@time",
"value": "19:28:40,023"
},
{
"field": "@name",
"value": "Nitish"
},
{
"field": "@hobby",
"value": "Pool"
},
{
"field": "@duration",
"value": "19 mins"
}
],
[
{
"field": "@timestamp",
"value": "2020-04-26 19:28:40.136"
},
{
"field": "@message",
"value": "Hello"
},
{
"field": "@time",
"value": "19:28:40,023"
},
{
"field": "@name",
"value": "Amuri"
},
{
"field": "@Totalruns",
"value": "2"
},
{
"field": "@wickets",
"value": "10"
},
{
"field": "@hobby",
"value": "cricket"
},
{
"field": "@commentry",
"value": "ubbjb"
}
],
[
{
"field": "@timestamp",
"value": "2020-04-26 19:28:40.136"
},
{
"field": "@message",
"value": "how are you"
},
{
"field": "@time",
"value": "19:28:40,023"
},
{
"field": "@name",
"value": "Kit"
},
{
"field": "@Totalruns",
"value": "90"
},
{
"field": "@wickets",
"value": "1"
},
{
"field": "@hobby",
"value": "cricket"
},
{
"field": "@commentry",
"value": "jbunib"
}
]
]
}
}
仅当@hobby = cricket 时,我才尝试解析@Totalruns 和@wickets
我能够到达直到访问板球无法弄清楚获取@Totalruns 和@wickets 的数据
我试过的代码 import json
f = open('/Users/amurin/Documents/test.json','r')
data = json.load(f)
for result in data['body']['results']:
for res in result:
if res['value']=='cricket':
print("Hello")
f.close()
我需要输出为 wickets = 1 , Totalruns = 90 wickets = 10 , Totalruns = 2
解决方案
解决方案1,保持结构不变:
def sublist_is_valid(sublist):
return any(d["field"] == "@hobby" and d["value"] == "cricket" for d in sublist)
def filter_fields(sublist):
return [d for d in sublist if d["field"] in ["@wickets", "@Totalruns"]]
filtered = [
filter_fields(sublist)
for sublist in data["body"]["results"]
if sublist_is_valid(sublist)
]
print(filtered)
输出:
[[{'field': '@Totalruns', 'value': '2'}, {'field': '@wickets', 'value': '10'}],
[{'field': '@Totalruns', 'value': '90'}, {'field': '@wickets', 'value': '1'}]]
解决方案 2(更好的 IMO)是从一开始就使用字典:
def sublist_to_dict(sublist):
return {d["field"]: d["value"] for d in sublist}
filtered = [
{key: d[key] for key in ["@Totalruns", "@wickets"]}
for d in [sublist_to_dict(sublist) for sublist in data["body"]["results"]]
if d.get("@hobby") == "cricket"
]
print(filtered)
输出:
[{'@Totalruns': '2', '@wickets': '10'}, {'@Totalruns': '90', '@wickets': '1'}]
推荐阅读
- ios - 使用 APPAUTH swift 自定义 SafariViewController
- angularjs - 如何使用量角器从文本中选择一个句子?
- responsive-design - 使用 Appcelerator Titanium 框架的响应式 UI 设计
- git - git 子模块。分离状态与主人
- reactjs - React 组件的中介模式
- php - Facebook API - 将网站产品复制到 Facebook 商店
- python - Django rest-auth 中的 create 和 perform_create 方法有什么区别
- javascript - 如何获取 JavaScript 控制台错误以进行调试
- php - 使用 storeAs 时 Windows 中的路径问题 - Laravel 5.4
- canvas - 引用查找值的 Microsoft PowerApps