Python 从嵌套JSON文档中提取值
我有以下JSON结构。我试图从“brow_eventdetails”部分提取以下信息Python 从嵌套JSON文档中提取值,python,regex,json,Python,Regex,Json,我有以下JSON结构。我试图从“brow_eventdetails”部分提取以下信息 时间 SBTime 时间 我的问题是,有没有简单的方法不用正则表达式就可以做到这一点。换句话说,我的问题是一种嵌套的JSON格式,我可以通过某种方式使用python提取它 { "AppName": "undefined", "Event": "browser information event", "Message": "
- 时间
- SBTime
- 时间
{
"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_数据['message']
message_data=json.loads(message)
f、 搜索(0)
dump(json_数据,f,确保_ascii=True)
我明白了
ValueError: No JSON object could be decoded
使用json.loads解析此字符串值,就像解析其他包含json的字符串一样。使用json.loads解析此字符串值,就像解析其他包含json的字符串一样。您需要再次解析
json\u 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
...
您需要再次解析
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
...
首先,您没有嵌套的json文档,该字段只是未赋值json字符串的字符串表示。首先修复此问题,然后停止使用
strip
或split
@Anzel-修复它是什么意思?不使用字符串和拆分?消息的字段值当前为字符串。使用strip
和split
处理它就像处理字符串一样,不要@Anzel-替代方法是什么?您需要放弃'brow_eventdetails:'
的消息字符串因为这不是一个有效的json字符串(字段名不带引号”
),所以在执行json.loads时它会失败。首先丢弃它,就像我使用replace('brow_eventdetails:','')
,然后剩余的字符串{…}
可以通过json.loads进行解析。首先,您没有嵌套的json文档,该字段只是未赋值json字符串的字符串表示。首先修复此问题,然后停止使用strip
或split
@Anzel-修复它是什么意思?不使用字符串和拆分?消息的字段值当前为字符串。使用strip
和split
处理它就像处理字符串一样,不要@Anzel-替代方法是什么?您需要放弃'brow_eventdetails:'
的消息字符串因为这不是一个有效的json字符串(字段名不带引号”
),所以在执行json.loads时它会失败。首先丢弃它,就像我使用replace('brow_eventdetails:','')
,然后剩余的字符串{…}
可以通过json.loads进行解析。