返回父元素和子数据的json查询?

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查询语言.

Jor*_*ley 6

不确定为什么你想要一个查询语言这很容易

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)

虽然我不知道它会匹配它们非常正确......


Man*_*nwe 2

错过了 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/