Python 当值为数字时,使用jmespath从键/值对获取值
我正在尝试使用jmespath从JSON文档中检索密钥(instanceId)。JSON文档如下所示:Python 当值为数字时,使用jmespath从键/值对获取值,python,jmespath,Python,Jmespath,我正在尝试使用jmespath从JSON文档中检索密钥(instanceId)。JSON文档如下所示: targets = {'instances': [ {'instanceId': u'i-035dd764fe1a08091', 'hostIp': '10.200.10.150'}, {'instanceId': u'i-04ed0d110fef5aef7', 'hostIp': '10.200.10.121'}, {'instanceId': u'i-
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语法是什么?最后,我试图从hostIp获取instanceId 由于某种原因,python实现需要`(backtick)文本分隔符,而不是
“
或”
因此,这将返回空列表:
[1]中的:jp.search('instances[?hostIp==“10.200.10.150”].instanceId',targets)
Out[1]:[]
但这会返回您正在寻找的内容:
[2]中的:jp.search('instances[?hostIp=='10.200.10.150`].instanceId',targets)
Out[2]:['i-035dd764fe1a08091']
出于某种原因,python实现需要`(倒勾)文本分隔符,而不是'
或“
因此,这将返回空列表:
[1]中的:jp.search('instances[?hostIp==“10.200.10.150”].instanceId',targets)
Out[1]:[]
但这会返回您正在寻找的内容:
[2]中的:jp.search('instances[?hostIp=='10.200.10.150`].instanceId',targets)
Out[2]:['i-035dd764fe1a08091']
hostIp==“10.200.10.150”
将对象中的hostIp值与对象中的10.200.10.150值进行比较(即将IP用作密钥,而不是原始值)。如果希望它是一个原始值,则需要使用单引号或反引号来启动原始json(然后使用`10.200.10.150`
)hostIp==“10.200.10.150”
将对象中的hostIp值与对象中的10.200.10.150值进行比较(即使用IP作为密钥,而不是原始值)。如果希望它是一个原始值,则需要使用单引号,或者使用反引号来启动原始json(然后使用`“10.200.10.150”`
)python jmespath实现在这里的行为似乎超出了规范,当它们不解析为json时,需要将反引号解释为字符串。这将不起作用,例如在go jmespath实现中,并且通常不是获取原始字符串值的可靠方法(因为如果它是有效的JSON,那么…)。关于与原始字符串值进行比较的符合规范的方法,请参见我的另一个答案。python jmespath实现在这里的行为似乎超出了规范,当它们不解析为JSON时,会返回到将后引内容解释为字符串。这将不起作用,例如在go jmespath实现中,并且通常不是获取原始字符串值的可靠方法(因为如果它是有效的JSON,那么…)。有关与原始字符串值进行比较的符合规范的方法,请参见我的其他答案。