无法在 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()
,它有助于更深一层,但仍然没有更多。
关于如何正确格式化并到达bids
和asks
的任何想法?
提前谢谢你。
【问题讨论】:
【参考方案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”
无法在 conda python 3.8 env 上正确安装 awswrangler(连接问题)