the*_*orn 11 python json jsoniq
鉴于以下json:
{
"README.rst": {
"_status": {
"md5": "952ee56fa6ce36c752117e79cc381df8"
}
},
"docs/conf.py": {
"_status": {
"md5": "6e9c7d805a1d33f0719b14fe28554ab1"
}
}
}
Run Code Online (Sandbox Code Playgroud)
是否有一种查询语言可以产生:
{
"README.rst": "952ee56fa6ce36c752117e79cc381df8",
"docs/conf.py": "6e9c7d805a1d33f0719b14fe28554ab1",
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我对JMESPath(http://jmespath.org/)的最佳尝试并不是非常接近:
>>> jmespath.search('*.*.md5[]', db)
['952ee56fa6ce36c752117e79cc381df8', '6e9c7d805a1d33f0719b14fe28554ab1']
Run Code Online (Sandbox Code Playgroud)
我已经与ObjectPath(http://objectpath.org)达成了同样的观点:
>>> t = Tree(db)
>>> list(t.execute('$..md5'))
['952ee56fa6ce36c752117e79cc381df8', '6e9c7d805a1d33f0719b14fe28554ab1']
Run Code Online (Sandbox Code Playgroud)
我无法理解JSONiq(我真的需要阅读一本105页的手册吗?)这是我第一次看json查询语言.
不确定为什么你想要一个查询语言这很容易
def find_key(data,key="md5"):
for k,v in data.items():
if k== key: return v
if isinstance(v,dict):
result = find_key(v,key)
if result:return result
dict((k,find_key(v,"md5")) for k,v in json_result.items())
Run Code Online (Sandbox Code Playgroud)
如果值dict总是将"_status"和"md5"作为键,那就更容易了
dict((k,v["_status"]["md5"]) for k,v in json_result.items())
Run Code Online (Sandbox Code Playgroud)
或者我觉得你可以做点什么
t = Tree(db)
>>> dict(zip(t.execute("$."),t.execute('$..md5'))
Run Code Online (Sandbox Code Playgroud)
虽然我不知道它会匹配它们非常正确......
错过了 python 的要求,但是如果你愿意调用外部程序,这仍然可以工作。请注意,需要 jq >= 1.5 才能正常工作。
# If single "key" $p[0] has multiple md5 keys, this will reduce the array to one key.
cat /tmp/test.json | \
jq-1.5 '[paths(has("md5")?) as $p | { ($p[0]): getpath($p)["md5"]}] | add '
# this will not create single object, but you'll see all key, md5 combinations
cat /tmp/test.json | \
jq-1.5 '[paths(has("md5")?) as $p | { ($p[0]): getpath($p)["md5"]}] '
Run Code Online (Sandbox Code Playgroud)
获取带有“md5”-key '?'=忽略错误的路径(例如测试键的标量)。从结果路径 ($p) 中过滤并用 '{}' = 对象包围结果。然后它们位于一个数组中([] 围绕整个表达式),然后将其“添加/合并”在一起|add
https://stedolan.github.io/jq/
| 归档时间: |
|
| 查看次数: |
2494 次 |
| 最近记录: |