无法在 python 3.8 中访问嵌套的 JSON

Posted

技术标签:

【中文标题】无法在 python 3.8 中访问嵌套的 JSON【英文标题】:Can't reach nested JSON in python 3.8 【发布时间】:2020-05-08 22:05:27 【问题描述】:

处理来自 Websockets 订阅的响应。

响应如下:

'jsonrpc': '2.0', 'method': 'subscription', 'params': 'channel': 'book.BTC-PERPETUAL.none.1.100ms', 'data': 'timestamp': 1588975154127, 'instrument_name': 'BTC-PERPETUAL', 'change_id': 19078703948, 'bids': [[10019.5, 8530.0]], 'asks': [[10020.0, 506290.0]]

我试图通过json.loads() 达到"bids""asks" 数组中的第一个也是唯一一个值

代码如下:

   async def __async__get_ticks(self):
  async with self.ws as echo:
     await echo.send(json.dumps(self.request))
     while True:
            response = await echo.receive()
            responseJson = json.loads(response)
            print(responseJson["params"]["data"])

错误提示:

print(responseJson["params"]["data"])

KeyError: '参数'

无论我如何尝试,它都不想捕获"jsonprc" 之后的任何 JSON,因为它成功返回了 2.0。超出此范围的任何内容都会出现错误。

我尝试使用.get(),它有助于更​​深一层,但仍然没有更多。

关于如何正确格式化并到达bidsasks 的任何想法?

提前谢谢你。

【问题讨论】:

【参考方案1】:

我建议使用dict.get() 方法,但请确保在查询预期具有嵌套字典的字典时将其设置为返回空字典。

默认情况下(如果您没有为dict.get() 指定第二个参数),它将返回None。这就解释了为什么你只能深入一层。

这是一个例子:

empty_dict = 
two_level_dict = 
    "one": 
        "level": "deeper!"
    


# This will return None and the second get call will not fail, because
# the first get returned an empty dict for the .get("level") call to succeed. 
first_get = empty_dict.get("one", ).get("level")

# This will return 'deeper!'
second_get = two_level_dict.get("one", ).get("level")

print(first_get)
print(second_get)

【讨论】:

以上是关于无法在 python 3.8 中访问嵌套的 JSON的主要内容,如果未能解决你的问题,请参考以下文章

无法在 macOS“Big Sur”和 python 3.8 中编译 pip 包:“ld:未知选项:-Bsymbolic”

Python 3.8:运行外部 C++ 代码:无法导入模块

使用 Python 访问 VSAM 文件?

无法在 conda python 3.8 env 上正确安装 awswrangler(连接问题)

无法在 python pandas 数据框中附加嵌套的 JSON 值

无法安装 Kivy(Windows 10,python 3.8)[重复]