【问题标题】:jq - extract additional JSON object into new arrayjq - 将额外的 JSON 对象提取到新数组中
【发布时间】:2016-04-04 02:39:54
【问题描述】:

我有一些 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,Finish,Start,Period

使用 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

任何帮助找出我做错了什么以及如何解决它将不胜感激。

谢谢

【问题讨论】:

  • 请修复 JSON。 "Attachments": "Attachments": 不正确。
  • @peak:道歉;固定

标签: json jq


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回复。你说的对;它是“设备”而不是“设备 ID”。不幸的是,尽管这不是问题的根本原因。似乎是+(.Attachments|from_entries) 导致了错误,这是我拉动.Attachments [] 所必需的。 +(.Tags|from_entries) 工作正常
  • 啊,对。现在很清楚问题是什么了。我会更新的。
猜你喜欢
  • 1970-01-01
  • 2016-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-19
  • 2020-05-23
  • 2023-04-02
相关资源
最近更新 更多