как ссылаться на массив данных websocket python-binance

#python #arrays #json #python-3.x #binance

#python #массивы #json #python-3.x #binance

Вопрос:

У меня есть скрипт, который получает этот массив данных binance json через websocket и выводит на консоль с помощью функции обратного вызова:

{"e":"outboundAccountPosition","E":1600502318390,"u":1600502318389,"B":[{"a":"BTC","f":"0.00000000","l":"0.00000000"},{"a":"BNB","f":"0.00000000","l":"0.00000000"},{"a":"XTZ","f":"0.00000000","l":"0.00000000"}]}

Мне нужно иметь возможность ссылаться на баланс BNB [«B»] [«f»] в функции обратного вызова. Я пробовал подобный код, но не работает.

 def callback_function(msg)
    if msg['e'] == 'outboundAccountPosition':
    print(msg["B"]["f"])
  

Печать всего сообщения работает нормально, поэтому я решил, что неправильно ссылаюсь на массив данных. Как исправить?
Спасибо

Ответ №1:

Вы только что получили строку, содержащую структуру JSON. Это можно преобразовать в python dict.

Для этого вы можете использовать любую библиотеку JSON, самой быстрой является ujson:

 import ujson as json

stream_data_dict = json.loads(stream_data_json)
print(stream_data_dict["B"]["f"])
  

Библиотека, которая делает это за вас и формирует хорошо именованные dicts, — unicorn_fy: https://github.com/oliver-zehentleitner/unicorn_fy

 from unicorn_fy.unicorn_fy import UnicornFy

received_stream_data_json = {"stream": "btcusdt@trade",
                             "data": {"e": "trade",
                                      "E": 1556876873656,
                                      "s": "BTCUSDT",
                                      "t": 117727701,
                                      "p": "5786.76000000",
                                      "q": "0.03200500",
                                      "b": 341831847,
                                      "a": 341831876,
                                      "T": 1556876873648,
                                      "m": True,
                                      "M": True}}

unicorn_fied_stream_data = UnicornFy.binance_com_websocket(received_stream_data_json)
print(unicorn_fied_stream_data)
>>>
{'stream_type': 'btcusdt@trade', 'event_type': 'trade', 'event_time': 1556876873656, 'symbol': 'BTCUSDT', 'trade_id': 117727701, 'price': '5786.76000000', 'quantity': '0.03200500', 'buyer_order_id': 341831847, 'seller_order_id': 341831876, 'trade_time': 1556876873648, 'is_market_maker': True, 'ignore': True, 'unicorn_fied': ['binance', '0.1.0']}