jq сохраняя границы массива - PullRequest
0 голосов
/ 21 мая 2018

У меня есть API, который сообщает о членстве в группе как массив, где каждая группа является элементом массива, который имеет массив членов.Я хочу упростить данные, но не удалять границы массива.

Когда есть три группы, API генерирует этот вывод, назовите его «3gr.json»:

[
   {
      "id" : "000E58D2E9B401400",
      "members" : [
         {
            "id" : "000E58D2E9B401400",
            "roomName" : "Room1",
            "groupState" : {
               "mute" : false,
               "volume" : 15
            },
            "state" : {
               "playbackState" : "STOPPED",
               "volume" : 15,
               "mute" : false
            }
         }
      ]
   },
   {
      "id" : "000E58D2FA0601400",
      "members" : [
         {
            "state" : {
               "playbackState" : "STOPPED",
               "volume" : 40,
               "mute" : false
            },
            "id" : "000E58D2FA0601400",
            "roomName" : "Room2",
            "groupState" : {
               "mute" : false,
               "volume" : 40
            }
         }
      ]
   },
   {
      "id" : "5CAAFD7B8C9801400",
      "members" : [
         {
            "groupState" : {
               "mute" : false,
               "volume" : 15
            },
            "roomName" : "Room3",
            "id" : "5CAAFD7B8C9801400",
            "state" : {
               "mute" : false,
               "playbackState" : "STOPPED",
               "volume" : 15
            }
         }
      ]
   }
]

Когда естьэто одна группа, в которой API производит этот вывод, назовите его «1gr.json»:

[
  {
    "id": "000E58D2E9B401400",
    "members": [
      {
        "id": "000E58D2E9B401400",
        "state": {
          "volume": 44,
          "mute": false,
          "playbackState": "PAUSED_PLAYBACK",
          "equalizer": {
            "bass": 2,
            "treble": 2,
            "loudness": true
          }
        },
        "roomName": "Room1",
        "groupState": {
          "volume": 46,
          "mute": false
        }
      },
      {
        "id": "5CAAFDE9614001400",
        "state": {
          "volume": 54,
          "mute": false,
          "playbackState": "PAUSED_PLAYBACK",
          "equalizer": {
            "bass": 0,
            "treble": 0,
            "loudness": true
          }
        },
        "roomName": "Room2",
        "groupState": {
          "volume": 65,
          "mute": false
        }
      },
      {
        "id": "5CAAFD7B8C9801400",
        "state": {
          "volume": 41,
          "mute": false,
          "playbackState": "PAUSED_PLAYBACK",
          "equalizer": {
            "bass": 0,
            "treble": 0,
            "loudness": false
          }
        },
        "roomName": "Room3",
        "groupState": {
          "volume": 41,
          "mute": false
        }
      }
    ]
  }
]

Если я использую jq для обработки этого вывода:

jq '.[].members[]|{name: .roomName, state: .state.playbackState, vol: .state.volume}' 3gr.json

Я получаю это:

{
  "name": "Room1",
  "state": "STOPPED",
  "vol": 15
}
{
  "name": "Room2",
  "state": "STOPPED",
  "vol": 40
}
{
  "name": "Room3",
  "state": "STOPPED",
  "vol": 15
}

Я получаю ту же структуру вывода (в этих двух примерах значения не важны), если я обрабатываю '1gr.json':

{
  "name": "Room1",
  "state": "PAUSED_PLAYBACK",
  "vol": 44
}
{
  "name": "Room2",
  "state": "PAUSED_PLAYBACK",
  "vol": 54
}
{
  "name": "Room3",
  "state": "PAUSED_PLAYBACK",
  "vol": 41
}

Что яхочу сохранить границы массива группового массива.Я пытался добавить различные комбинации [ ], но безрезультатно.Так что я хотел бы видеть:

[
    [
        {
            "name": "Room1",
            "state": "PAUSED_PLAYBACK",
            "vol": 44
        },
        {
            "name": "Room2",
            "state": "PAUSED_PLAYBACK",
            "vol": 54
        },
        {
            "name": "Room3",
            "state": "PAUSED_PLAYBACK",
            "vol": 41
        }
    ]
]

и

[
    [
        {
            "name": "Room1",
            "state": "PAUSED_PLAYBACK",
            "vol": 44
        }
    ],
    [
        {
            "name": "Room2",
            "state": "PAUSED_PLAYBACK",
            "vol": 54
        }
    ],
    [
        {
            "name": "Room3",
            "state": "PAUSED_PLAYBACK",
            "vol": 41
        }
    ]
]

1 Ответ

0 голосов
/ 22 мая 2018

Кажется, что, по сути, вы должны использовать map вместо .[].

map(.members
    | map({name: .roomName, state: .state.playbackState, vol: .state.volume}) )

(Так как map(f) это просто [.[]|f], вы также можете использовать последнюю форму, но письмо map делает намерение вполне ясным.)

...