从嵌套的JSON文档中提取值

时间:2015-05-13 04:03:32

标签: python regex json

我有以下JSON结构。我试图从" brow_eventdetails"中提取以下信息。部分。

  • ATIME
  • SBTime
  • 的CTime

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

       {
            "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 =真)

我得到了

ValueError: No JSON object could be decoded

2 个答案:

答案 0 :(得分:4)

您需要再次解析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

...

答案 1 :(得分:1)

使用json.loads解析此字符串值,就像使用包含JSON的每个其他字符串一样。