【问题标题】:Filter openapi spec by routes按路由过滤 openapi 规范
【发布时间】:2021-09-23 23:13:28
【问题描述】:

我有一个 openapi 规范,我想在该规范上选择一个路径子集(因此,按键过滤)。我无法让 with_entries 命令过滤路径列表。

示例 JSON:

{
  "swagger": "2.0",
  "info": {},
  "host": "petstore.swagger.io",
  "basePath": "/api",
  "schemes": [],
  "consumes": [],
  "produces": [],
  "paths": {
    "/pets": {},
    "/pets/{id}": {}
  },
  "definitions": {}
}

输入是json,输出应该是相同的json,但只留下'/pets'路由(过滤掉“/pets/{id}”路由)。

我们将有一个可能包含 20 条路线的列表,因此想要一个干净的解决方案,并允许我将 ~20 条路线分别指定为变量。

我尝试了here 的一些答案并想出了这个:(我们还需要捕获并保留其他顶级键,但我现在专注于路径过滤,但答案是非常欢迎!)

.paths
["/pets"] as $whitelist
| with_entries( select( .key as $k | any( $whitelist[]; . == $k) ) ) 

但是,这会产生错误 (jq: error (at file.json:xx): Cannot iterate over null (null)

所以有两个问题需要解决:

  1. 如何保留原始json中的所有元素,但过滤掉部分路径
  2. 如何使脚本“干净”,以便轻松维护要保留的路径列表

【问题讨论】:

    标签: jq openapi


    【解决方案1】:

    我更喜欢建立一个查找表。

    jq '
       ( ["/pets"] | map({ (.): true }) | add ) as $whitelist |
       .paths |= with_entries(select( $whitelist[.key] ))
    '
    

    jqplay

    【讨论】:

    • 太棒了。你介意添加一些关于发生了什么的解释吗?
    • 我的意思是,我做到了。我构建了一个查找表 ({ "/pets": true } as $whitelist),然后使用查找表 (select( $whitelist[.key] )) 中的键选择条目
    猜你喜欢
    • 2019-06-14
    • 2023-02-16
    • 2017-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 2022-07-15
    相关资源
    最近更新 更多