Получить значение из пары ключ/значение, используя jmespath, когда значение является числом

Я пытаюсь получить ключ (instanceId) из документа JSON, используя jmespath. Документы JSON выглядят так:

targets = {'instances':
  [
     {'instanceId': u'i-035dd764fe1a08091', 'hostIp': '10.200.10.150'}, 
     {'instanceId': u'i-04ed0d110fef5aef7', 'hostIp': '10.200.10.121'}, 
     {'instanceId': u'i-0f7778162b14c954f', 'hostIp': '10.200.20.135'}
  ]
}

Я чувствую, что это должно работать:

jmespath.search('instances[?hostIp=="10.200.10.150"].instanceId', targets)

но он возвращает пустой набор. При замене IP-адреса строкой, например. письмо, он возвращает instanceId. Каков синтаксис jmespath для поиска значения, когда это число? В конечном счете, я пытаюсь получить instanceId от hostIp.


person Jeremy Cowan    schedule 07.11.2017    source источник


Ответы (2)


hostIp=="10.200.10.150" сравнивает значение hostIp в объекте со значением 10.200.10.150 в объекте (т. е. использует IP в качестве ключа, а не необработанное значение). Если вы хотите, чтобы это было необработанное значение, вам нужно либо использовать одинарные кавычки, либо использовать обратные кавычки, чтобы запустить необработанный json (а затем использовать `"10.200.10.150"`)

person james.haggerty    schedule 23.08.2018

По какой-то причине реализация Python требует разделителя текста ` (обратная кавычка) вместо ' или "

Итак, это возвращает пустой список:

In [1]: jp.search('instances[?hostIp=="10.200.10.150"].instanceId', targets) Out[1]: []

Но это возвращает то, что вы ищете:

In [2]: jp.search('instances[?hostIp==`10.200.10.150`].instanceId', targets) Out[2]: ['i-035dd764fe1a08091']

person Tetlanesh    schedule 02.01.2018
comment
Реализация python jmespath, по-видимому, ведет себя здесь вне спецификации, возвращаясь к интерпретации обратных кавычек как строк, когда они не анализируются как JSON. Это не будет работать, например, в реализации go jmespath, и, как правило, это ненадежный способ получить необработанное строковое значение (потому что, если это допустимый JSON, то...). См. мой другой ответ для совместимых со спецификацией способов сравнения с необработанными строковыми значениями. - person james.haggerty; 24.08.2018