JQ从具有以字符串结尾的字段的数组中获取对象
JQ get objects from array that has a field ending in string
我正在尝试做我认为应该是一个相当简单的过滤器,但我一直 运行 出错。我有这个 JSON:
{
"versions": [
{
"archived": true,
"description": "Cod version 3.3/Sprint 8",
"id": "11500",
"name": "v 3.3",
"projectId": 11500,
"releaseDate": "2016-03-15",
"released": true,
"self": "https://xxxxxxx.atlassian.net/rest/api/2/version/11500",
"startDate": "2016-02-17",
"userReleaseDate": "14/Mar/16",
"userStartDate": "16/Feb/16"
},
{
"archived": true,
"description": "Hot fix",
"id": "12000",
"name": "v3.3.1",
"projectId": 11500,
"releaseDate": "2016-03-15",
"released": true,
"self": "https://xxxxxxx.atlassian.net/rest/api/2/version/12000",
"startDate": "2016-03-15",
"userReleaseDate": "14/Mar/16",
"userStartDate": "14/Mar/16"
},
{
"archived": false,
"id": "29704",
"name": "Sync-diff v1.0.0",
"projectId": 11500,
"releaseDate": "2022-02-16",
"released": true,
"self": "https://xxxxxxx.atlassian.net/rest/api/2/version/29704",
"startDate": "2022-02-06",
"userReleaseDate": "15/Feb/22",
"userStartDate": "05/Feb/22"
}
]
}
我只想return任何以'22'结尾的userReleaseDate
我可以通过以下方式获得布尔结果:
jq '.versions[].userReleaseDate | endswith("22")'
打印出假、假、真
但我不确定如何检索对象。我试过这个的变体:
[.versions[] as $keys | $keys select(endswith("22"))]
并且每个都抛出一个错误。任何帮助将不胜感激。
直接在对象列表上使用select
,提取并检查其参数中的发布日期:
jq '.versions[] | select(.userReleaseDate | endswith("22"))'
这太接近了:
jq '.versions[].userReleaseDate | endswith("22")'
而不是输出它们是否以22
结尾,你想要select值以 22
结尾。固定:
jq '.versions[].userReleaseDate | select( endswith("22") )'
现在,您的问题要求以 22
结尾的日期,但标题表明您想要 objects。为此,您需要一些不同的东西。我们希望 select 来自版本,而不是日期。
jq '.versions[] | select( .userReleaseDate | endswith("22") )' # As a stream
jq '[ .versions[] | select( .userReleaseDate | endswith("22") ) ]' # As an array
jq '.versions | map( select( .userReleaseDate | endswith("22") ) )' # As an array
[ .versions[] as $keys | $keys select(endswith("22")) ]
存在一些问题。
数组元素的键通常不叫keys,而是indexes。 $indexes
会是一个更好的名字。
Except .versions[]
获取数组元素的 values,而不是 keys/索引。 $values
会是一个更好的名字。
除了变量一次只取一个值。 $value
会是一个更好的名字。
$version
会是一个更好的名字。
$keys
和 select(endswith("22"))
之间少了一个 |
。
任何地方都没有提到 userReleaseDate
。
结果放在一个数组中(因为[ ]
)。没有必要也没有这个愿望。
你可以使用
.versions[] as $version | $version.userReleaseDate | select(endswith("22"))
或
.versions[].userReleaseDate as $date | $date | select(endswith("22"))
但这只是
的overly-complicated个版本
jq '.versions[].userReleaseDate | select( endswith("22") )'
我正在尝试做我认为应该是一个相当简单的过滤器,但我一直 运行 出错。我有这个 JSON:
{
"versions": [
{
"archived": true,
"description": "Cod version 3.3/Sprint 8",
"id": "11500",
"name": "v 3.3",
"projectId": 11500,
"releaseDate": "2016-03-15",
"released": true,
"self": "https://xxxxxxx.atlassian.net/rest/api/2/version/11500",
"startDate": "2016-02-17",
"userReleaseDate": "14/Mar/16",
"userStartDate": "16/Feb/16"
},
{
"archived": true,
"description": "Hot fix",
"id": "12000",
"name": "v3.3.1",
"projectId": 11500,
"releaseDate": "2016-03-15",
"released": true,
"self": "https://xxxxxxx.atlassian.net/rest/api/2/version/12000",
"startDate": "2016-03-15",
"userReleaseDate": "14/Mar/16",
"userStartDate": "14/Mar/16"
},
{
"archived": false,
"id": "29704",
"name": "Sync-diff v1.0.0",
"projectId": 11500,
"releaseDate": "2022-02-16",
"released": true,
"self": "https://xxxxxxx.atlassian.net/rest/api/2/version/29704",
"startDate": "2022-02-06",
"userReleaseDate": "15/Feb/22",
"userStartDate": "05/Feb/22"
}
]
}
我只想return任何以'22'结尾的userReleaseDate
我可以通过以下方式获得布尔结果:
jq '.versions[].userReleaseDate | endswith("22")'
打印出假、假、真
但我不确定如何检索对象。我试过这个的变体:
[.versions[] as $keys | $keys select(endswith("22"))]
并且每个都抛出一个错误。任何帮助将不胜感激。
直接在对象列表上使用select
,提取并检查其参数中的发布日期:
jq '.versions[] | select(.userReleaseDate | endswith("22"))'
这太接近了:
jq '.versions[].userReleaseDate | endswith("22")'
而不是输出它们是否以22
结尾,你想要select值以 22
结尾。固定:
jq '.versions[].userReleaseDate | select( endswith("22") )'
现在,您的问题要求以 22
结尾的日期,但标题表明您想要 objects。为此,您需要一些不同的东西。我们希望 select 来自版本,而不是日期。
jq '.versions[] | select( .userReleaseDate | endswith("22") )' # As a stream
jq '[ .versions[] | select( .userReleaseDate | endswith("22") ) ]' # As an array
jq '.versions | map( select( .userReleaseDate | endswith("22") ) )' # As an array
[ .versions[] as $keys | $keys select(endswith("22")) ]
存在一些问题。
数组元素的键通常不叫keys,而是indexes。
$indexes
会是一个更好的名字。Except
.versions[]
获取数组元素的 values,而不是 keys/索引。$values
会是一个更好的名字。除了变量一次只取一个值。
$value
会是一个更好的名字。$version
会是一个更好的名字。$keys
和select(endswith("22"))
之间少了一个|
。任何地方都没有提到
userReleaseDate
。结果放在一个数组中(因为
[ ]
)。没有必要也没有这个愿望。
你可以使用
.versions[] as $version | $version.userReleaseDate | select(endswith("22"))
或
.versions[].userReleaseDate as $date | $date | select(endswith("22"))
但这只是
的overly-complicated个版本jq '.versions[].userReleaseDate | select( endswith("22") )'