其他分享
首页 > 其他分享> > 【jmespath】—3. 进阶 Object Projections

【jmespath】—3. 进阶 Object Projections

作者:互联网

继续,来看Object Projections。

一、Object Projections

上面说的是列表投影,只适用于列表。那么对于json对象,可以用对象投影。
投影最终返回的仍然是个列表,只不过内部的元素是查询到的key-value键值对中的value

import jmespath

dic_1 = {
  "ops": {
    "functionA": {"numArgs": 2},
    "functionB": {"numArgs": 3},
    "functionC": {"variadic": True}
  }
}
path = jmespath.search("ops.*.numArgs", dic_1)
print(path)

#运行结果
D:\Daily\whatisyeild>python jmespath_demo.py
[2, 3]

可以看到,*创建了json列表,并且通配符处于哪个层级的key,就会遍历这个层级key的所有value。
上面的例子中, ops.*就是会找 functionA、functionB、functionC,而更进一步ops.*.numArgs 则是继续往里面找到keynumArgs的值,并放到投影的列表里去返回,所以看的返回的结果是[2, 3]

官方的解释

ops.*.numArgs中的通配符*我们可以看做一个分界线,分为左边和右边,即左边ops,右边numArgs

第一步,左边初始化了一个可以投影的数组:

evaluate(ops, inputData) -> [{"numArgs": 2}, {"numArgs": 3},
                             {"variadic": True}]

第二步,右边遍历数组里的每一个元素:

evaluate(numArgs, {numArgs: 2}) -> 2
evaluate(numArgs, {numArgs: 3}) -> 3
evaluate(numArgs, {variadic: true}) -> null

但是因为variadic这个key与 numArgs不匹配,所以返回的是null
而对于null,是不会添加到最终返回的结果数组里的,所以最终结果只有[2, 3]

标签:进阶,ops,evaluate,Object,key,variadic,numArgs,jmespath
来源: https://blog.51cto.com/u_13407532/2727577