繁体   English   中英

jq - 将其他JSON对象提取到新数组中

[英]jq - extract additional JSON object into new array

我有一些JSON。 它看起来像这样:

{
"Volumes": [
    {
        "Attachments": [
            {
                "VolumeId": "vol-11111111",
                "State": "attached",
                "DeleteOnTermination": false,
                "Device": "/dev/sdz"
            }
        ],
        "Tags": [
            {
                "Value": "volume1",
                "Key": "Name"
            },
            {
                "Value": "00:00",
                "Key": "Start"
            },
            {
                "Value": "00:20",
                "Key": "Finish"
            },
            {
                "Value": "2",
                "Key": "Period"
            }
        ],
        "VolumeId": "vol-11111111"
    },
    {
        "Attachments": [
            {
                "VolumeId": "vol-22222222",
                "State": "attached",
                "DeleteOnTermination": false,
                "Device": "/dev/sdz"
            }
        ],
        "Tags": [
            {
                "Value": "volume2",
                "Key": "Name"
            },
            {
                "Value": "00:00",
                "Key": "Start"
            },
            {
                "Value": "00:20",
                "Key": "Finish"
            },
            {
                "Value": "2",
                "Key": "Period"
            }
        ],
        "VolumeId": "vol-22222222"
    },
    {
        "Attachments": [
            {
                "VolumeId": "vol-333333333",
                "State": "attached",
                "DeleteOnTermination": false,
                "Device": "/dev/sdz"
            }
        ],
        "Tags": [
            {
                "Value": "volume3",
                "Key": "Name"
            },
            {
                "Value": "00:00",
                "Key": "Start"
            },
            {
                "Value": "00:20",
                "Key": "Finish"
            },
            {
                "Value": "2",
                "Key": "Period"
            }
        ],
        "VolumeId": "vol-33333333"
    }
]
}

使用jq,我能够提取以下信息:

VolumeId,完成,开始,周期

使用jq命令

cat json | jq -r '[.Volumes[]|({VolumeId}+(.Tags|from_entries))|{VolumeId,Finish,Start,Period}]'

[
  {
    "VolumeId": "vol-11111111",
    "Finish": "00:20",
    "Start": "00:00",
    "Period": "2"
  },
  {
    "VolumeId": "vol-22222222",
    "Finish": "00:20",
    "Start": "00:00",
    "Period": "2"
  },
  {
    "VolumeId": "vol-33333333",
    "Finish": "00:20",
    "Start": "00:00",
    "Period": "2"
  }
]

这一切都很好。 但是我需要额外的提取.Attachments.Device。 我正在寻找每个数组的输出类似于:

 [
  {
    "VolumeId": "vol-11111111",
    "Finish": "00:20",
    "Start": "00:00",
    "Period": "2",
    "DeviceId": "/dev/sdz"
  },
  {
    "VolumeId": "vol-22222222",
    "Finish": "00:20",
    "Start": "00:00",
    "Period": "2",
    "DeviceId": "/dev/sdz"
  },
  {
    "VolumeId": "vol-33333333",
    "Finish": "00:20",
    "Start": "00:00",
    "Period": "2",
    "DeviceId": "/dev/sdz"
  }
]

但是,如果没有出错,我无法弄清楚如何做到这一点。 对我来说最合乎逻辑的方法是做一些像:

cat json | jq -r '[.Volumes[]|({VolumeId}+(.Attachments|from_entries)+(.Tags|from_entries))|{VolumeId,Finish,Start,Period,DeviceId}]'

但是我得到错误:

jq: error (at <stdin>:91): Cannot use null (null) as object key

任何帮助弄清楚我做的不正确以及如何解决它将非常感激。

谢谢

最终,问题是你在Attachments数组上使用from_entries时它不起作用。 from_entries采用键/值对对象的数组来创建具有这些值的对象。 但是,您没有键/值对,而是对象。 如果您只是尝试将它们组合在一起,则应使用add

此外,没有名为DeviceId属性,它是Device 如果要选择Device属性并将其作为DeviceId ,则需要提供正确的名称。

.Volumes | map(
    ({ VolumeId } + (.Attachments | add) + (.Tags | from_entries))
      | { VolumeId, Finish, Start, Period, DeviceId: .Device }
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM