Извините, если это глупый вопрос, но я транслирую данные с сервера и пытаюсь получить определенные значения по ключам, и они работают, только если я сначала проверю, присутствует ли ключ
Пример JSON
{"time_exchange":"2018-04-04T14:29:53.0847306Z","time_coinapi":"2018-04-04T14:29:53.0847306Z","ask_price":117.1,"ask_size":158.30616728,"bid_size":102.60064,"bid_price":117.09,"symbol_id":"COINBASE_SPOT_LTC_USD","sequence":25388355,"type":"quote"}
Он печатает правильно, если я сделаю это:
data = json.loads(ws.recv())
if 'ask_size' in data:
print data['ask_size']
Но если я просто:
data = json.loads(ws.recv())
print data['ask_size']
Я получаю ключевую ошибку:
KeyError: 'ask_size'
если я просто «распечатываю данные», он отображает json, например: {u'symbol_id ': u'COINBASE_SPOT_LTC_USD', u'sequence ': 23691601, u'time_exchange': u'2018-04-04T14: 39: 36.7990026Z ', u'time_coinapi': u'2018-04-04T14: 39: 36.7990026Z ', u'ask_price': 116.21, u'ask_size ': 28.0, u'bid_price': 116.15, u'type ': u'quote ', u'bid_size': 317.94169746} Да, используя json-модуль python, я не знаю, делаю ли я что-то крайне неправильно, просто странно, что он будет печатать внутри, если внутри, но не без
Все значения могут быть извлечены ключом внутри if in, но я не хочу включать ненужный код, у него всегда будут ключи
Не могу воспроизвести, у меня оба работают.
Во втором примере (выдача ключевой ошибки) вы уверены, что действительно получаете данные json? если нет, можно попробовать j = ws.recv(); print j; data = json.loads(j)?
Он получает строку, которую я конвертирую в json с помощью json.loads, так странно, что я также не могу воспроизвести ее при установке в качестве переменной, только при получении потоковых данных
data = json.loads (ws.recv ()) stream = ws.recv () data = json.loads (stream) print data ['bid_price'] позволяет мне распечатать значение по ключу, но если я сделаю stream = ws .recv () data = json.loads (stream) print data ['bid_price'] Я снова получаю ключевую ошибку, это так странно для меня
Я ценю вашу помощь
Также: data = json.loads (ws.recv ()) print data.get ('bid_size') действительно работает, я просто воспользуюсь этим
заявленная цель API таков, что вы будете каждый раз получать разные данные, да? Считали ли вы, что данные, которые вы получаете, могут иногда включать ключ, а иногда нет? В частности, если вы неоднократно вызываете API, сервер может решить отправить вам некоторую ошибку JSON во второй раз, чтобы удержать вас от флуда.
Да, именно в этом и проблема, он возвращал "{u'type ': u'hearbeat'}" в качестве первого ответа, даже когда не запрашивал сердцебиение, извините, что потратил впустую время






Первый момент: ни использование промежуточной переменной, ни проверка наличия ключа не изменят содержимое dict. Период. Единственный эффект проверки наличия ключа в dict - предотвращение KeyError, когда он отсутствует.
Совершенно очевидно, что здесь происходит то, что ключ иногда отсутствует, а иногда и нет. Вы можете легко проверить это с помощью правильного теста:
data = json.loads(ws.recv())
if 'ask_size' in data:
print data['ask_size']
else:
print "'ask_size' not found in %s" % data
Ты прав. Эта служба сначала возвращает "{u'type ': u'hearbeat'}", даже если не спрашивает об этом, как глупо с моей стороны
что будет если просто
print data? вы используете модуль pythonjsonили сторонний модуль?