【问题标题】:Handling weird JSON from API call with json.loads使用 json.loads 处理来自 API 调用的奇怪 JSON
【发布时间】:2019-12-31 12:26:46
【问题描述】:

我在在下面的块中有效地存储 PhoneNumber 值时遇到了问题

    response = requests.get(api)
    data = json.loads(response.text)

所以在完成上述操作后,我有一个字典“数据”,如下所示:

{'Key1': 'Some Value ', 'Key2': [{'PhoneNumber': '180000000000'}]}

我们的目标是只获取 PhoneNumber 值,即'180000000000',我的第一反应是下面这个可行,但我知道这不会很好地扩展。想知道在上面的 json.loads 调用中我是否可以传递一个参数,或者是否有人对如何更有效地获得我感兴趣的这个值有其他建议。

    data = data['Key2'][0]['PhoneNumber'])

所以在上面的数据现在 = '180000000000' 并且我想将它存储在 s3 之后,我有一个 JSON 文件的旧代码(如下),这有效但毫无意义。我只需要将电话号码存储为文本文件(我知道如何使用 open for .txt,但我对如何使用 io.Bytes 以及是否应该使用 SringIO 而不是 BytesIO 感到困惑)

    inmemory = io.BytesIO() 
    with gzip.GzipFile(fileobj=inmemory, mode='wb') as fh:

        with io.TextIOWrapper(fh, encoding='utf-8',errors='replace') as wrapper:
            wrapper.write(json.dumps(data, ensure_ascii=False,indent=2))
    inmemory.seek(0)
    s3_resource.Object(s3bucket, s3path + '.json.gz').upload_fileobj(inmemory)  
    inmemory.close()

当它像这样存储时,当我从 S3 中提取值时,我必须使用“with gzip.open”并对其进行解码

【问题讨论】:

  • 你让事情变得比他们需要的更难——这是一个包含字典的列表。不要将您解析的数据转回字符串:data['Key2'][0]['PhoneNumber'] 是您所需要的。
  • 使用 json.loads 有什么意义吗?
  • 是的,假设您以 json 字符串开头 — loads 将其转换为 python 数据结构。
  • 我可能会误解,但这看起来像是两个独立的问题(自编辑以来):一个询问如何更有效地检索电话号码,另一个询问BytesIO。也许这应该分成两个单独的 SO 帖子?
  • 嗨,克里斯,你是对的,我再次道歉,这应该是一个单独的问题

标签: python json amazon-web-services api amazon-s3


【解决方案1】:

字符串化data['Key2'] 是不必要的,标准字典和列表访问语法应该适用于您的情况。浓缩成一行:

>>> data = {'Key1': 'Some Value ', 'Key2': [{'PhoneNumber': '180000000000'}]}
>>> data['Key2'][0]['PhoneNumber']
'180000000000'

您也可以(并且可能应该)在此处处理错误情况,也许可以通过将其拆分为多个步骤或将KeyErrorIndexError 一起捕获。作为一种选择,请查看 contextlib (docs) 中的新 suppress 实用程序。看起来像这样:

>>> with suppress(KeyError, IndexError):
...     ph = data['Key2'][0]['PhoneNumber']
...
>>> ph
'180000000000'

【讨论】:

  • 嗨克里斯,谢谢你的帮助,我会输入支票,因为你的回复确实让事情变得更有效率,我更新了我的问题中的代码以反映现在,想知道是否还有空间改进,如果 json.loads 是必要的,因为初始块是文本中的 api 响应,那么字典然后作为字符串返回(即在字典解析后将其设置回“数据”时)。另外,将数据写入/从 s3 写入数据的最佳方式是什么
  • 我在这里爆发了第二个问题:stackoverflow.com/questions/59539656/…
  • 我为什么要在这里处理错误情况?我会寻找抑制,ty for docs link
  • 您需要检查错误,以防响应正文包含的数据不符合您的预期。 (例如,如果 data['Key2'][]。)如果有其他东西正在验证您的输入,则这不是必需的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2013-09-20
相关资源
最近更新 更多