如何使用jq来展平json中的嵌套键

时间:2017-07-11 12:39:07

标签: json command-line nested key jq

我目前正尝试使用jq命令行

在json下面进行处理
cat api-docs.json  | jq '.paths'

{
...
...

  "paths": {
    "/pets": {
         "get": {
...
...
        "post": {
...
...
    "/pets/{petId}": {
         "get": {
...

https://jqplay.org/s/GV2zMjbCWK

我需要来自上面的swagger规范的扁平化信息

[ "GET /pets", "POST /pets", "GET /pets/{petId}" ]
使用jq命令可以实现

吗?

以下我独立得到每个值

.paths|{k:keys,v:map(keys)}

但我需要的是一种在嵌套级别组合键以获得上述结果的方法,即“METHOD / PATH”数组

1 个答案:

答案 0 :(得分:2)

以下过滤器会生成您想要的结果,如下所示:

.paths
| to_entries
| map( .key as $path
       | ( .value | to_entries[]
           | if .key == "get" then "GET"
             elif .key == "post" then "POST" 
             else empty end ) as $verb
       | $verb + " " + $path )

输出:

[
  "GET /pets",
  "POST /pets",
  "GET /pets/{petId}"
]

您可能希望包含更多"动词",或以编程方式处理动词,例如

.paths
| to_entries
| map(( .value | to_entries[] | .key | ascii_upcase ) + " " + .key)

讨论

此处解决方案的关键是to_entries,它会生成{" key":_," value":_}形式的对象数组。除了map,这里省去了解包数组然后重新打包,其余的是语法: - )