给定json:

[
  {
    "path": "Module1/",
    "users": [
      "john",
      "jane"
    ]
  },
  {
    "path": "Module2/",
    "users": [
      "mike",
      "mary"
    ]
  },
  {
    "path": "Module3/",
    "users": [
      "billy",
      "bonny"
    ]
  }
]

给定的文件数组:

[
  "Module1/file.java",
  "Module3/file.java"
]

How can I get the users for which any of the files match the path?

预期输出:

[
  "john",
  "jane",
  "billy",
  "bonny"
]

我最近找到了一个类似问题的答案,它巧妙地构建了正则表达式过滤器,并在JQ中作为arg传递: https://stackoverflow.com/a/54630000/8784215

我的设置与此类似:

users='[{"path":"Module1/","users":["john","jane"]},{"path":"Module2/","users":["mike","mary"]},{"path":"Module3/","users":["billy","bonny"]}]'
files='["Module1/file.java","Module3/file.java"]'
filter=($(echo $files | jq -r  '. | join(" ")'))
echo $users | jq --arg re "$(IFS="|"; echo "${filter[*]}")" '[.[] | select(.path | test($re)) | .users[]]'

但问题是,路径是与文件匹配的,而实际上应该是相反的.

有什么主意吗?

推荐答案

您可以使用ìnside来翻转contains测试的参数,该测试执行子字符串匹配.使用any在第一个匹配时 Select ,使用input读取第二个输入(文件数组):

jq 'input as $f | map(select(any(.path | inside($f[]); .)).users[])' input.json files.json
[
  "john",
  "jane",
  "billy",
  "bonny"
]

Demo

Json相关问答推荐

从Json响应中为需要每个值的Post请求提取多个值

将数组中的值作为键连接到另一个数组中的值(Jolt)

PowerShell脚本未按预期生成预期的JSON输出

Jolt变换将字段移动到数组的每个元素中

JQ-JSON将键转换为对象

用巨大的值更新SQL Server中的nvarchar(max)

导致此 Kotlin Retrofit2 错误的可能原因有哪些?

带有 API 测试的 Typescript JSON 模式验证

使用本地 JSON api react TS Axios

使用 serde 和 csv crates 将嵌套的 json 对象序列化为 csv

如何使用 serde_json 构建有状态的流式解析器?

xidel:是否可以从 JSON 对象中检索特定的嵌套值?

如何通过 jolt 将一个对象中的键和值添加到数组中的每个对象中

使用 KQL 和外部 data() 运算符从 json 文件中提取信息

如何使用 LINQ 在 C# 中重构对象?

如何配置spring mvc 3在json响应中不返回null对象?

如何在 MVC4 中将 Json 字符串输出为 JsonResult?

嵌套 JSON:如何向对象添加(推送)新项目?

java.lang.BootstrapMethodError:调用站点#4 bootstrap 方法的异常,初始化 retrofit 时

PHP json_encode json_decode UTF-8