使用字符串条件和 JMESPATH 进行 JSON 解析

标签 json jq jmespath

我在使用基于字符串条件的 Jmespath 解析 json 时遇到问题。我想根据另一个键的字符串值的条件获取一个键的值。它们都位于给定字典的同一层次结构中。然而,字典的父键是一个变量。我熟悉jq,但jmespath对我来说是新的。我正在使用它,因为当前的项目依赖于它。因此,在更改解析器方面没有太多选择。

下面的示例 Json :-

{
  "people": {
    "a": {"First":"James", "last": "1"},
    "b": {"First":"Jacob", "last": "2"},
    "c": {"First":"Jayden", "last": "3"},
    "d": {"First":"different", "last" : "4"}
  }
}

我想获取最后一个的值,其中第一个的值以“J”开头。

我尝试引用官方网站http://jmespath.org/tutorial.html提供的文章。然而,他们中的大多数都集中在标准 key 结构上,而很少关注可变 key 字典结构。因此我无法为给定的 json 编写 jmespath 查询。

用于实现预期结果的 jq 等效项如下:-

.people | .[] | select (.First | startswith("J")) | .last

根据我的理解,我可以逻辑地得出的最接近的 jmespath 查询是:-

people.*[?starts_with(First,`J`)].last

但是,上述查询返回空白结果。

预期输出为

 "d","e","f"

我无法理解我哪里出了问题。 如果有人能给我指出一篇好文章或帮助我找到上述问题的解决方案,那就太好了。

非常感谢

最佳答案

更新:

解决方案是使用values(@)

引用链接 https://github.com/jmespath/jmespath.site/issues/24

因此,上述问题的可能解决方案之一是

people.values(@)[?starts_with(First,`J`)].last

因此,对于任何变量 key ,我们可以使用 value(@) 来过滤结构中进一步向下的投影。

关于使用字符串条件和 JMESPATH 进行 JSON 解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57481891/

相关文章:

php - 在一个查询中将多个表作为单独的对象获取

javascript - 使用ajax获取json数组值

powershell - 格式化 docker events 的 json 输出

ansible - JMESpath 表达式按属性过滤对象并返回具有此属性集的对象名称列表

javascript - 使用 .get 获取 json 数据 jquery

java - 从 mysql select 获取计数结果并解析到 TextView

json - 设置多个值

json - 使用 jq 从 json 中提取数据时将数组值写入同一行

json - 用于展平对象数组的 JMESPath 表达式,每个对象都有嵌套的对象数组

python - 从对象中的 JMESPath 表达式中提取 key