微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Swagger 定义解析为简化的 JS 对象复杂对象操作

如何解决Swagger 定义解析为简化的 JS 对象复杂对象操作

我正在尝试使用 TypeDoc、Swagger 和 SwaggerJsDoc 为我的项目构建一些文档。由于 TypeDoc 和 swagger 具有不同的注释类型并且 Swagger 注释更加详细,我希望 TypeDoc 读取我的 Swagger 注释。我设法利用 TypeDoc 的注释解析器并成功地为我的代码和 API 组合创建了漂​​亮的自定义文档,例如:

Documentation generated with Typedoc

我对此非常满意,但很难将 Swagger 的模式定义解析为纯 Javascript 对象以显示我的响应或正文示例。在我看来,Swaggers 的定义太复杂了。它们可以在保持相同信息的同时大大简化。他们是这样来的:

  {
    "type": "object","properties": {
      "minStockProds": {
        "type": "array","items": {
          "type": "object","properties": {
            "sku": {
              "type": "string"
            },"minStock": {
              "type": "number"
            },"ref": {
              "type": "string"
            }
          }
        }
      },"ordersCount": {
        "type": "number"
      }
    }
  }

或者这个!,极端一点:

{
        "type": "object","properties": {
          "test": {
            "type": "object","properties": {
              "test1": {
                "type": "string"
              },"test2": {
                "type": "object","properties": {
                  "test3": {
                    "type": "number"
                  },"test4": {
                    "type": "array","items": {
                      "type": "object","properties": {
                        "test5": {
                          "type":"string"
                        },"test6": {
                          "type": "number"
                        }
                      }
                    }
                  }
                }
              }
            }
          },"test7": {
            "type":"array","items":{
              "type": "object","properties": {
                "name":{
                  "type": "string"
                },"value": {
                  "type": "number"
                }
              }
            }
          }
        }
      }

我该如何解析它?

{
  minStockProds: [
    {
      sku: "string",minStock: "number",ref: "string"
    }
  ],ordersCount: "number",}

或者,这个?

{
  test: {
    test1: "string",test2: {
      test3: "number",test4: [
        {
          test5: "string",test6: "number",}
      ]
    }
  },test7: [
    {
      name: "string",value: "number",}
  ]
}

我已经尝试了很多方法来适应所有这些类型的对象,以至于我的代码现在看起来很可怕而且在这里显示很混乱,通读它会很费力。

谁能给一个提示或告诉一个可以为我提供便利的图书馆?不需要完全解决这个问题,只需要寻找选项。我什至试图查看 Swagger-UI 包,看看他们是如何做到的,但仍在寻找能够做到这一点的功能

非常感谢!

解决方法

在用头撞墙很多次之后,我设法找到了这样的东西。一点也不漂亮,但它有效。我将它发布在这里是因为我不希望任何人像我一样经历数天的反复试验。

function sanitizeObjectPropertyTypes(swaggerObj) {
  let copyObj = JSON.parse(JSON.stringify(swaggerObj));
  if(copyObj.$ref){
    copyObj = copyObj.$ref;
  } if (copyObj.description) {
    delete copyObj.description;
  }

  let parsedObj = {};

  function parse(obj,current) {
    let ikey;
    let value;
    for (key in obj) {
      if (obj.hasOwnProperty(key)) {
        value = obj[key];
        ikey = current ? `${current}.${key}` : key;
        if (typeof value === 'object') {
          parse(value,ikey);
        } else if (ikey !== 'type') {
          const path = ikey.replace(/(properties|\.properties|\.items|\.schema|\.type)/g,'').replace(/^\.*|\.*$/,'').replace('..','.');
          lodash.set(parsedObj,path,obj[key]);
        }
      }
    }
  }

  function insertArray(obj) {
    function recurse(objRec) {
      const keys = Object.keys(objRec);
      for (let i = 0; i < keys.length; i++) {
        if (typeof objRec[keys[i]] === 'object') {
          if (objRec[keys[i]].type === 'array') {
            const path = getObjPathByKey({ obj,key: keys[i] })[0].replace(/(properties|\.properties|\.items|\.schema|\.type)/g,'.');
            const val = lodash.get(parsedObj,path);
            lodash.set(parsedObj,[val]);
          }
          recurse(objRec[keys[i]]);
        }
      }
    }
    recurse(obj);
    if (parsedObj.items) {
      parsedObj = [parsedObj.items];
    }
    if(parsedObj.schema){
      parsedObj = parsedObj.schema;
    }
  }
  parse(copyObj,'');
  insertArray(copyObj);

  return parsedObj;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。