Skip to main content
 首页 » 编程设计

python之从嵌套的 JSON 文档中提取值

2025年05月04日58JeffreyZhao

我有以下 JSON 结构。我正在尝试从“brow_eventdetails”部分提取以下信息。

  • 时间
  • SB时间
  • 时间

我的问题是有没有不使用正则表达式的简单方法来做到这一点。换句话说,我的问题是我可以使用 python 通过某种方式提取的嵌套 JSON 格式。

       { 
            "AppName": "undefined", 
            "Event": "browser information event", 
            "Message": "brow_eventdetails:{\"Message\":\"for https://mysite.myspace.com/display/CORE/mydetails took too long (821 ms : ATime: 5 ms, SBTime: 391 ms, CTime: 425 ms), and exceeded threshold of 5 ms\",\"Title\":\"mydetails My Work Details\",\"Host\":\"nzmyserver.ad.mydomain.com\",\"Page URL\":\"https://nzmyserver.mydomain.com/display/CORE/mydetails\",\"PL\":821,\"ATime\":5,\"SBTime\":391,\"CTime\":425}", 
            "Severity": "warn", 
            "UserInfo": "General Info" 
        } 

我使用的程序如下。

     with open(fname, 'r+') as f: 
       json_data = json.load(f) 
       message = json_data['Message'] 
         nt = message.split('ATime')[1].strip().split(':')[1].split(',')[0] 
         bt = message.split('SBTime')[1].strip().split(':')[1].split('\s')[0]) 
         st = message.split('CTime')[1].strip().split(':')[1].split('\s')[0]) 
         json_data["ATime"] = bt 
         json_data["SBTime"] = st 
         json_data["CTime"] = nt 
        f.seek(0) 
        json.dump(json_data,f,ensure_ascii=True) 

这个程序有一些问题。第一个是提取 ATime、SBTime 和 CTime。这些值是重复的。我只想提取数值 5、391 和 425。我不想要它后面的 ms。我该如何实现?

如果我将程序更新为使用 json.loads() 如下所示,我会收到以下错误

以 open(fname, 'r+') 作为 f: json_data = json.load(f) message = json_data['消息'] message_data = json.loads(消息) f.seek(0) json.dump(json_data,f,ensure_ascii=True)

我明白了

ValueError: No JSON object could be decoded 

请您参考如下方法:

您需要再次解析 json_data['message'] 的 json 字符串,然后访问所需的值,一种方法是:

# since the string value of `message` itself isn't a valid json string 
# discard it, and parse it with json again 
brow_eventdetails = json.loads(json_data['message'].replace('brow_eventdetails:', '')) 
 
brow_eventdetails['ATime'] 
Out[6]: 5 
 
brow_eventdetails['SBTime'] 
Out[7]: 391 
 
brow_eventdetails['CTime'] 
Out[8]: 425 
 
...