Итак, у меня есть такая структура:
[
{
"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.
Для каждого вопроса может быть более одного ответа. Все, что меня волнует, это запись type: "A"
. После небольшой работы и чтения я придумал следующее:
. | select(
(.status = "NOERROR") and
(.class = "IN") and
(.data.answers? != null)) | select(.data.answers | map(select(.type == "A")))
Это работает, чтобы дать мне только те объекты, тип которых "A". Однако из-за способа, которым я его построил, я теряю значение «name» верхнего уровня. Единственное возвращаемое значение - это сами фактические answer
объекты, объекты в answers[]
Проблема в том, что мне нужно получить доступ к исходному значению имени (верхнего уровня). Я упускаю что-то простое здесь, может кто-нибудь помочь мне?
Спасибо
РЕДАКТИРОВАТЬ: То, что я хочу распечатать в конце, в основном значение .name
верхнего уровня и каждое значение .data
где type == "A"
. Вероятно, есть гораздо более простой способ сделать это, поэтому, если есть совершенно другой подход, я тоже рад это слышать!
РЕДАКТИРОВАТЬ 2: Я изначально думал, что это будет проще, и сделал:
. | select(
(.status = "NOERROR") and
(.class = "IN") and
(.data.answers? != null) and
(.data.answers[].type=="A")) | .
... но это возвращает весь список значений A
, CNAME
и других типов, если, кажется, присутствует только один A
. Так что не повезло