微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 jmes 查询过滤嵌套数组

如何解决使用 jmes 查询过滤嵌套数组

我必须知道“John”在“销售”部门工作的公司名称。我的 JSON 看起来像这样:

[
            {
            "name" : "John","company" : [{
                        "name" : "company1","department" : "sales"
                        },{
                        "name" : "company2","department" : "backend"
                        },{
                        "name" : "company3","department" : "sales"
                        }
                      ],"phone" : "1234"
            }
]

而我的 jmesquery 是这样的:

jmesquery: "[? name=='John'].company[? department=='sales'].{Company: name}"

但是通过这个查询,我得到了一个 null 数组。

解决方法

这是因为您的第一个过滤器 [?name=='John'] 正在创建一个 projection,更具体地说是一个 filter projection,您必须重置它才能进一步过滤它。
可以使用 pipes 来重置投影。

投影是 JMESPath 中的一个重要概念。但是,有时投影语义不是您想要的。一个常见的场景是当您想要对投影的结果进行运算而不是将表达式投影到数组中的每个元素上时。 例如,表达式 people[*].first 将为您提供一个数组,其中包含 people 数组中每个人的名字。如果您想要该列表中的第一个元素怎么办?如果您尝试 people[*].first[0] 只是为 people 数组中的每个元素计算 first[0],并且由于没有为字符串定义索引,最终结果将是一个空数组 []。要实现所需的结果,您可以使用管道表达式 <expression> | <expression> 来指示必须停止投影。

来源:https://jmespath.org/tutorial.html#pipe-expressions

因此,这是您查询的第一步:

[?name=='John'] | [].company[?department=='sales'].{Company: name}

这就是说,这仍然以数组数组结尾:

[
  [
    {
      "Company": "company1"
    },{
      "Company": "company3"
    }
  ]
]

因为您可能会在一个 John 中出现多个名为 sales department 的人。
因此,一个数组用于 users,另一个用于 companies/departments

为了解决这个问题,您可以使用 flatten operator[]

所以我们以:

[?name=='John'] | [].company[?department=='sales'].{Company: name} []

给出:

[
  {
    "Company": "company1"
  },{
    "Company": "company3"
  }
]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。