Json 使用jq基于值从列表中选择对象,访问顶级对象
所以我有一个这样的结构:Json 使用jq基于值从列表中选择对象,访问顶级对象,json,jq,Json,Jq,所以我有一个这样的结构: [ { "name": "aaaaa", "type": "A", "class": "IN", "status": "NOERROR", "data": { "answers": [ { "ttl": 30, "type": "CNAME", "class": "IN", "name": "aaaaa", "data": "bbbbb"
[
{
"name": "aaaaa",
"type": "A",
"class": "IN",
"status": "NOERROR",
"data": {
"answers": [
{
"ttl": 30,
"type": "CNAME",
"class": "IN",
"name": "aaaaa",
"data": "bbbbb"
},
{
"ttl": 1800,
"type": "CNAME",
"class": "IN",
"name": "bbbbb",
"data": "ccccc"
},
{
"ttl": 60,
"type": "A",
"class": "IN",
"name": "ccccc",
"data": "1.2.3.4"
}
],
},
{
"name": ...
...
它基本上是一个DNS解析数据列表
对于每个问题,可能有多个答案。我只关心类型:“A”
记录。在做了一点工作和阅读之后,我想到了这个:
. | select(
(.status = "NOERROR") and
(.class = "IN") and
(.data.answers? != null)) | select(.data.answers | map(select(.type == "A")))
这只用于提供类型为“A”的对象。但是,由于我构建它的方式,我丢失了顶级“name”值。返回的唯一内容是实际的answer
对象本身,即answers[]
问题是,我需要访问原始(顶级)名称值。我错过了一些简单的事情,有人能帮我一下吗
谢谢
编辑:我想在最后打印的基本上是顶级的.name
值和每个.data
值,其中类型==“A”
。有一种可能更简单的方法可以做到这一点,所以如果有一种完全不同的方法,我也很高兴听到这个
EDIT2:我原本以为这会更简单,但我做到了:
. | select(
(.status = "NOERROR") and
(.class = "IN") and
(.data.answers? != null) and
(.data.answers[].type=="A")) | .
。。。但这会返回整个A
、CNAME
和其他类型的值列表,似乎只要存在一个A
。那就没有运气了
但是,由于我构建它的方式,我丢失了顶级“name”值
那就呆在顶级吧
.[]
| select(.class == "IN" and .status == "NOERROR")
| .name + ": " + (.data.answers[] | select(.type == "A") .data)?
@oguz ismail的答案是有效的,我只需将
[]
更改为
,否则就会出现字符串索引错误。可能是因为我没有清楚地表示数据结构。谢谢