jq程序来操纵具有未知键的对象

时间:2019-02-20 00:31:06

标签: json jq

我需要操作数组中的对象,这些对象的单个键不是固定的公共字符串。这是一个简单的示例:

echo '{ "a": { "b" : 1 } }'|jq '. as $save|keys'

因此,问题是“ a”可能是任何东西。因此,我不能使用jq'.a'。我发现获取密钥名称的唯一方法是通过内置的 keys 功能。但是,键似乎不希望与逗号一起播放(引发语法错误,例如:)

echo '{ "a": { "b" : 1 } }'|jq 'keys, . as $save|$save[.]'

如果将它们作为唯一的管道阶段反转,则会出现另一个错误:

echo '{ "a": { "b" : 1 } }'|jq '. as $save, keys'
jq: error: syntax error, unexpected ',', expecting 
'|' (Unix shell quoting issues?) at <top-level>, 
line 1:  . as $save, keys
jq: 1 compile error

键似乎是输入的唯一运算符,也是输出的唯一来源。

还有其他方法可以找到 “ a”吗?

如果我简化了我给出的示例,而您却不明白问题所在,那么请考虑一下我实际需要处理的数据子集:

{
  "rows": [
    {
      "i-0cf0": {
        "chef_environment": "alpha-prod",
        "ec2.placement_availability_zone": "us-east-1d"
      }
    },
    {
      "i-f9aa": {
        "chef_environment": "alpha-qa",
        "ec2.placement_availability_zone": "us-east-1b"
      }
    }
  ]
}

评论使我不得不添加此其他内容。我想对上述输入进行其他操作的一个示例是:根据chef_environment的特定值进行选择,并为这些值输出密钥和可用性区域,例如

i-f9aa,us-east-1b

1 个答案:

答案 0 :(得分:1)

jq函数to_entries{ "KEY": "VALUE" }转换为{ "key": "KEY", "value": "VALUE" }

鉴于此,您可以这样直接引用键或它们映射到的值:

.rows[] | to_entries[] |  [.key, .value["ec2.placement_availability_zone"]] | @csv

...给定您的输入和输出(以原始模式运行时):

"i-0cf0","us-east-1d"
"i-f9aa","us-east-1b"