![](/img/trans.png)
[英]How to filter an array of objects based on values in an inner array with jq?
[英]How to filter values from an array that was cURL'ed - JSON with .JQ
{
"accounts": [
{
"accountId": "account001",
"tokens": [
"tokens1",
"tokens2",
"tokens3",
"tokens4",
]
}
]
}
所以上面是我正在使用的一个例子,我的问题是如何过滤掉任何令牌,以便我可以一目了然地看到有什么?
我已经看到很多这样的其他答案
{
"ok": true,
"items": [
{"id": 123, "name": "thing-1"},
{"id": 124, "name": "thing-2"},
{"id": 125, "name": "thing-3"}
]
}
cat file.json | jq '.items[] | select(.name == "thing-3") | .'
但是,正如您所看到的,令牌不像他们的示例那样具有 .name 。
其他人可以让我知道如何获取我拥有的数据并搜索它以查看它是否有 token2?
在此先感谢您提供的任何帮助。
我能够在评论中使用 MarcoLucidi 的建议来解决问题
jq '.accounts[].tokens[] | select(. == "tokens2")
如何过滤掉任何令牌,以便我一目了然地看到它有什么?
其他人可以让我知道如何获取我拥有的数据并搜索它以查看它是否有 token2?
我不确定我是否理解这个问题,但鉴于“如何过滤将"tokens2"
列为令牌的帐户的解释? 因为这将是您可以对数据做的有意义且并非完全微不足道的事情。
鉴于此 jqplay 代码段,jq 查询:
.accounts | map(select(.tokens | index("tokens2")) | .accountId)
从以下数据中查找["account001", "account003"]
:
{
"accounts": [
{
"accountId": "account001",
"tokens": [
"tokens1",
"tokens2",
"tokens3",
"tokens4"
]
},
{
"accountId": "account002",
"tokens": [
"tokens3",
"tokens4"
]
},
{
"accountId": "account003",
"tokens": [
"tokens1",
"tokens2"
]
}
]
}
解释如下:
.accounts
将文档缩减为帐户列表。... | map(select(...))
... | map(select(...))
过滤掉...
产生null
的账户。.tokens | ...
.tokens | ...
将每个帐户对象减少到其令牌列表( .
inside map(...)
是被映射的帐户数组的每个元素,因此.tokens
是该帐户对象的子列表)。... | index("tokens2")
... | index("tokens2")
生成一个非零索引,如果在列表中找不到该值,则生成null
。map(...)
内部但在select(...)
外部,一个... | .accountId
... | .accountId
被应用,因此通过select(...)
过滤器的每个对象都减少到只有它的帐户 ID。您还可以通过删除某些部分来试验每个部分的工作方式:
.accounts | map(select(.tokens | index("tokens2")) | .accountId)
.accounts | map(select(.tokens | index("tokens2")))
[ .accounts[] | select(.tokens | index("tokens2")) | .accountId ]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.