这是我的 json.
[
{
"time": "2017-06-10 00:00:48-0400,317",
"UserInfo": {
"AppId": "ONE_SEARCH",
"UsageGroupId": "92600",
},
"Items": [
{
"PublicationCode": "",
"OpenUrlRefId": "",
"ReferringUrl": "N",
"OpenAccess": "0",
"ItmId": "1328515516"
}
]
},
{
"time": "2017-06-10 00:00:48-0400,548",
"UserInfo": {
"AppId": "DIALOG",
"UsageGroupId": "1195735",
},
"Items": [
{
"Origin": "Alert",
"PublicationCode": "",
"NumberOfCopies": 1,
"ItmId": "1907446549"
},
{
"Origin": "Alert",
"PublicationCode": "",
"NumberOfCopies": 1,
"ItmId": "1907446950",
}
]
}
]
Run Code Online (Sandbox Code Playgroud)
我想使用 jq 提取其元素“Items”中具有“Origin”:“Alert”的对象。结果应该是这样的:
{
"time": "2017-06-10 00:00:48-0400,548",
"UserInfo": {
"AppId": "DIALOG",
"UsageGroupId": "1195735",
},
"Items": [
{
"Origin": "Alert",
"PublicationCode": "",
"NumberOfCopies": 1,
"ItmId": "1907446549"
},
{
"Origin": "Alert",
"PublicationCode": "",
"NumberOfCopies": 1,
"ItmId": "1907446950",
}
]
}
Run Code Online (Sandbox Code Playgroud)
或这个:
{
"Items": [
{
"Origin": "Alert",
"PublicationCode": "",
"NumberOfCopies": 1,
"ItmId": "1907446549",
"ReasonCode": ""
},
{
"Origin": "Alert",
"PublicationCode": "",
"NumberOfCopies": 1,
"ItmId": "1907446950",
}
]
}
Run Code Online (Sandbox Code Playgroud)
如何使用jq来做到这一点?我尝试了多种方法,但大多数方法只会返回一个包含所有子对象的数组,其中包含“Origin”:“Alert”。我需要这些子对象仍然保持结构,因为我需要知道它们中的哪些一起发生,哪些单独发生。
顺便说一句,“Origin”的唯一值是“Alert”。因此,如果您有任何方法可以选择具有给定键名称的对象,它也应该有效。
谢谢你!:)
过滤器:
.[] | select( any(.Items[]; .Origin == "Alert"))
Run Code Online (Sandbox Code Playgroud)
产生第一个提到的可接受的结果。如果你的jq没有any/2那么我建议升级。如果这不是一个选项,那么您可以使用以下简单但效率低下的过滤器:
.[] | select( .Items | map(.Origin) | index("Alert"))
Run Code Online (Sandbox Code Playgroud)
或者:
.[] | select(reduce .Items[] as $item (false; . or ($item | .Origin == "Alert")))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4485 次 |
| 最近记录: |