Не удается достичь вложенных JSON в python 3,8 - PullRequest
1 голос
/ 09 мая 2020

Работа с ответом от подписки 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]]}}}

И я пытаюсь достичь первого и единственного значения внутри "bids" и "asks" массивы через json.loads()

Код выглядит так:

   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: 'params'

Как бы я ни старался, он не хочет перехватывать какой-либо из JSON после "jsonprc", для чего он успешно возвращает 2.0. Все, что выходит за рамки этого, всегда приводит к ошибке.

Я пробовал использовать .get(), и это помогает go на один уровень глубже, но все же не больше.

Любые идеи о том, как это сделать отформатируйте это правильно и получите bids и asks?

Заранее спасибо.

1 Ответ

1 голос
/ 09 мая 2020

Я бы предложил использовать метод dict.get(), но убедитесь, что вы установили его так, чтобы он возвращал пустой словарь при запросе словарей, которые, как ожидается, будут иметь вложенные dicts.

По умолчанию (если вы этого не сделаете укажите второй аргумент для dict.get()), он вернет None. Это объясняет, почему вы смогли только go глубже на один уровень.

Вот пример:

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)
...