【问题标题】:Extracting values form nested JSON document从嵌套的 JSON 文档中提取值
【发布时间】:2015-07-24 04:32:00
【问题描述】:

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

  • 时间
  • SBTime
  • CTime

我的问题是有什么简单的方法可以在不使用正则表达式的情况下做到这一点。换句话说,我的问题是我可以使用 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) 消息 = json_data['消息'] message_data = json.loads(消息) f.seek(0) json.dump(json_data,f,ensure_ascii=True)

我明白了

ValueError: No JSON object could be decoded

【问题讨论】:

  • 首先,您没有 NESTED json 文档,该字段只是未评估的 json 字符串的字符串表示。首先修复此问题并停止使用stripsplit
  • @Anzel - 修复它是什么意思?而不是使用字符串和拆分?
  • message 的字段值当前是一个字符串。您正在使用stripsplit 像字符串一样处理它,不要!
  • @Anzel - 有什么替代方案?
  • 您需要丢弃 'brow_eventdetails:'message 字符串,因为这不是有效的 json 字符串(不带引号的字段名称 ""),因此当您执行 json.loads 时它会失败。先丢掉,像我用replace('brow_eventdetails:', ''),然后剩下的字符串{...}可以被json.loads解析。

标签: python regex json


【解决方案1】:

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

...

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-26
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      相关资源
      最近更新 更多