Python 当值为数字时,使用jmespath从键/值对获取值

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-

我正在尝试使用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-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,那么…)。有关与原始字符串值进行比较的符合规范的方法,请参见我的其他答案。