Оценка значения json по ключу внутри if in, но не без

Извините, если это глупый вопрос, но я транслирую данные с сервера и пытаюсь получить определенные значения по ключам, и они работают, только если я сначала проверю, присутствует ли ключ

Пример 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'

что будет если просто print data? вы используете модуль python json или сторонний модуль?

Guillaume 04.04.2018 16:38

если я просто «распечатываю данные», он отображает 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, я не знаю, делаю ли я что-то крайне неправильно, просто странно, что он будет печатать внутри, если внутри, но не без

Sven Kahn 04.04.2018 16:40

Все значения могут быть извлечены ключом внутри if in, но я не хочу включать ненужный код, у него всегда будут ключи

Sven Kahn 04.04.2018 16:42

Не могу воспроизвести, у меня оба работают.

user3483203 04.04.2018 16:43

Во втором примере (выдача ключевой ошибки) вы уверены, что действительно получаете данные json? если нет, можно попробовать j = ws.recv(); print j; data = json.loads(j)?

Guillaume 04.04.2018 16:48

Он получает строку, которую я конвертирую в json с помощью json.loads, так странно, что я также не могу воспроизвести ее при установке в качестве переменной, только при получении потоковых данных

Sven Kahn 04.04.2018 16:57

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'] Я снова получаю ключевую ошибку, это так странно для меня

Sven Kahn 04.04.2018 17:02

Я ценю вашу помощь

Sven Kahn 04.04.2018 17:03

Также: data = json.loads (ws.recv ()) print data.get ('bid_size') действительно работает, я просто воспользуюсь этим

Sven Kahn 04.04.2018 17:06

заявленная цель API таков, что вы будете каждый раз получать разные данные, да? Считали ли вы, что данные, которые вы получаете, могут иногда включать ключ, а иногда нет? В частности, если вы неоднократно вызываете API, сервер может решить отправить вам некоторую ошибку JSON во второй раз, чтобы удержать вас от флуда.

Karl Knechtel 04.04.2018 17:12

Да, именно в этом и проблема, он возвращал "{u'type ': u'hearbeat'}" в качестве первого ответа, даже когда не запрашивал сердцебиение, извините, что потратил впустую время

Sven Kahn 04.04.2018 17:14
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
11
23
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Первый момент: ни использование промежуточной переменной, ни проверка наличия ключа не изменят содержимое 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'}", даже если не спрашивает об этом, как глупо с моей стороны

Sven Kahn 04.04.2018 17:13

Другие вопросы по теме