首页 > 解决方案 > 使用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

标签: jsonpython-3.x

解决方案


解决方案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'}]

推荐阅读