【问题标题】:jq preserving array boundariesjq保留数组边界
【发布时间】:2018-05-20 21:01:50
【问题描述】:

我有一个 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
        }
    ]
]

【问题讨论】:

  • 请遵循 mcve 指南。特别是,如果您可以显示至少一对输入和相应的输出,将会有所帮助。
  • 我用两组输入和两组输出更新了问题。
  • 我应该写“相应的期望输出”。目前尚不清楚(至少对我而言)保留数组边界是什么意思。
  • 好的,我已经添加了我想查看的输出表单。谢谢。

标签: arrays json jq


【解决方案1】:

看来,从本质上讲,您应该使用map 而不是.[]

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

(由于map(f)只是[.[]|f],你也可以使用后一种形式,但写map的意图很明确。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多