spring 解析swagger.json

2023-10-26

微服务开发,经常会用到swagger,开发过程中也可以直接验证、测试接口是否可用,但是由于swagger不是正式的对接文档,我们提供给前端或者外部来进行联调时还是要正式的文档。为了解决这一痛点,发现swagger是通过swagger.json解析生成html的,那是否也可以通过解析json来生成对应的word文档呢?生成word的完整代码已上传gitee,可以供大家一起讨论、学习。下面只提供将json解析的工具类,不废话,直接上源码

老规矩 ,在pom中导入jar包依赖

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.70</version>
        </dependency>

直接上源码

public class SwaggerJsonUtil {

    public static String getHost(JSONObject swaggerJson) {
        //JSONObject swaggerJson = JSON.parseObject(swaggerJsonStr,Feature.DisableCircularReferenceDetect);
        return swaggerJson.getString("host");
    }
    
    public static SwaggerInfoVo getInfo(JSONObject swaggerJson) {
        return swaggerJson.getObject("info", SwaggerInfoVo.class);
    }
    
    /**
     * 解析所有的接口
     * @param swaggerJson
     * @return
     */
    public static List<PathInfoVo> getPathInfo(JSONObject swaggerJson){
        JSONObject paths = swaggerJson.getJSONObject("paths");
        List<PathInfoVo> list = new ArrayList<>();
        //所有的definitions
        Map<String,JSONObject> refMap = getDefinitions(swaggerJson);
        if(paths != null) {
             Iterator<Entry<String, Object>> it = paths.entrySet().iterator();
             while(it.hasNext()) {
                 PathInfoVo pathInfo = new PathInfoVo();
                 Entry<String, Object> path = it.next();
                 String pathUrl = path.getKey();
                 pathInfo.setPathUrl(pathUrl);
                 //请求方式
                 JSONObject pathJson = paths.getJSONObject(pathUrl);
                 Set<String> methodSet = pathJson.keySet();
                 //当方法支持多种请求方式时也只取第一种
                 if(CollectionUtils.isNotEmpty(methodSet)) {
                    String httpMethod = methodSet.iterator().next();
                    pathInfo.setHttpMethod(httpMethod);
                    JSONObject methodJson = pathJson.getJSONObject(httpMethod);
                    String summary = methodJson.getString("summary");
                    String operationId = methodJson.getString("operationId");
                    String description = methodJson.getString("description");
                    pathInfo.setDescription(description);
                    pathInfo.setOperationId(operationId);
                    pathInfo.setSummary(summary);
                    JSONArray parameters = methodJson.getJSONArray("parameters");
                    JSONObject responses = methodJson.getJSONObject("responses");
                    List<ParameterVo> reqParameters = getParameter(parameters,refMap);
                    pathInfo.setReqList(reqParameters);
                    List<ResponseVo> respList = getResponse(responses,refMap);
                    pathInfo.setRespList(respList);
                 }
                 list.add(pathInfo);
             }
        }
        return list;
    }
    
    /**
     * 解析响应数据
     * @param responses
     * @param refMap
     * @return
     */
    public static List<ResponseVo> getResponse(JSONObject responses,Map<String,JSONObject> refMap){
        List<ResponseVo> respParameters = new ArrayList<>();
        if(responses != null && responses.containsKey("200")) {
            //只解析200的数据
            JSONObject successJson = responses.getJSONObject("200");
            if(successJson.containsKey("schema")) {
                JSONObject schema = successJson.getJSONObject("schema");
                String schemaType = schema.getString("type");
                String ref = "";
                if(schema.containsKey("$ref")) {
                    ref = schema.getString("$ref");
                }
                if("array".equalsIgnoreCase(schemaType)){
                    JSONObject items = schema.getJSONObject("items");
                    if(items.containsKey("$ref")) {
                        ref = schema.getString("$ref");
                    }else {
                        ResponseVo resp = new ResponseVo();
                        resp.setName("");
                        resp.setType(items.getString("type"));
                        respParameters.add(resp);
                    }
                }
                if(StringUtils.isNotBlank(ref)) {
                    String def = ref.substring(14);
                    JSONObject defJson = refMap.get(def);
                //    String type = defJson.getString("type");
                    JSONObject properties = defJson.getJSONObject("properties");
                    Set<String> respKeys = properties.keySet();
                    for(String key : respKeys) {
                        JSONObject respMap = properties.getJSONObject(key);
                        ResponseVo resp = new ResponseVo();
                        resp.setName(key);
                        resp.setFormat(respMap.getString("format"));
                        resp.setDescription(respMap.getString("description"));
                        String respType = respMap.getString("type");
                        resp.setType(StringUtils.isBlank(respType)?"object":respType);
                        resp.setRequired(respMap.getBooleanValue("required"));
                        if(respMap.containsKey("$ref")) {
                            String childRef = respMap.getString("$ref");
                            String childDef = childRef.substring(14);
                            JSONObject childDefJson = refMap.get(childDef);
                            JSONObject childProperties = childDefJson.getJSONObject("properties");
                            getRef(refMap,childProperties,resp,childDef,childDefJson);
                        }else if("array".equalsIgnoreCase(respType)) {
                            JSONObject items = respMap.getJSONObject("items");
                            if(items.containsKey("$ref")) {
                                String itemRef = items.getString("$ref");
                                String itemDef = itemRef.substring(14);
                                JSONObject itemDefJson = refMap.get(itemDef);
                                JSONObject childProperties = itemDefJson.getJSONObject("properties");
                                getRef(refMap,childProperties,resp,itemDef,itemDefJson);
                            }
                        }
                        respParameters.add(resp);
                    }
                }
            }
        }
        return respParameters;
    }
    
    /**
     * 递归响应数据
     * @param refMap  所有的definitions
     * @param respMap  当前需要解析的JSON对象
     * @param parentVoName  上级ref的名称,与上级相同不继续递归(树结构)
     * @return
     */
    public static List<ResponseVo> getRef(Map<String,JSONObject> refMap,JSONObject childProperties,ResponseVo parentResp,String parentVoName,JSONObject childJson) {
        Set<String> childSet = childProperties.keySet();
        List<ResponseVo> childResp = new ArrayList<>();
        for(String key : childSet) {
            JSONObject childMap = childProperties.getJSONObject(key);
            ResponseVo resp = new ResponseVo();
            resp.setName(key);
            resp.setFormat(childMap.getString("format"));
            resp.setDescription(childMap.getString("description"));
            String childType = childMap.getString("type");
            resp.setType(StringUtils.isNotBlank(childType)?childType:childJson.getString("type"));
            resp.setRequired(childMap.getBooleanValue("required"));
            childResp.add(resp);
            parentResp.setChildResp(childResp);
            if(childMap.containsKey("$ref")) {
                String childRef = childMap.getString("$ref");
                String childDef = childRef.substring(14);
                JSONObject childDefJson = refMap.get(childDef);
                JSONObject pro = childDefJson.getJSONObject("properties");
                //additionalProperties
                if(pro != null && !childDef.equalsIgnoreCase(parentVoName)) {
                    getRef(refMap,pro,resp,childDef,childDefJson);
                }
            }else if("array".equalsIgnoreCase(childType)) {
                JSONObject items = childMap.getJSONObject("items");
                if(items.containsKey("$ref")) {
                    String itemRef = items.getString("$ref");
                    String itemDef = itemRef.substring(14);
                    JSONObject itemDefJson = refMap.get(itemDef);
                    JSONObject pro = itemDefJson.getJSONObject("properties");
                    if(pro != null && !itemDef.equalsIgnoreCase(parentVoName)) {
                        getRef(refMap,pro,resp,itemDef,itemDefJson);
                    }
                }
            }
        }
        return childResp;
    }
    
    /**
     * 解析请求参数
     * @param parameters
     * @param refMap
     * @return
     */
    public static List<ParameterVo> getParameter(JSONArray parameters,Map<String,JSONObject> refMap){
        List<ParameterVo> reqParameters = new ArrayList<>();
        if(CollectionUtils.isNotEmpty(parameters)) {
            for(int i = 0; i < parameters.size(); i ++) {
                JSONObject paramJson = parameters.getJSONObject(i);
                ParameterVo param = JSON.parseObject(JSON.toJSONString(paramJson),ParameterVo.class);
                if(paramJson.containsKey("schema")) {
                    JSONObject schema = paramJson.getJSONObject("schema");
                    String schemaType = schema.getString("type");
                    String ref = "";
                    if(schema.containsKey("$ref")) {
                        ref = schema.getString("$ref");
                    }
                    if("array".equalsIgnoreCase(schemaType)){
                        JSONObject items = schema.getJSONObject("items");
                        if(items.containsKey("$ref")) {
                            ref = schema.getString("$ref");
                        }else {
                            List<ParameterVo> childParamList = new ArrayList<>();
                            ParameterVo childParam = new ParameterVo();
                            childParam.setName("");
                            childParam.setType(items.getString("type"));
                            childParamList.add(childParam);
                            param.setChildParam(childParamList);
                        }
                    }else {
                        param.setType(schemaType);
                    }
                    if(StringUtils.isNotBlank(ref)) {
                        String def = ref.substring(14);
                        JSONObject defJson = refMap.get(def);
                        if(defJson != null) {
                            param.setType(defJson.getString("type"));
                            JSONObject properties = defJson.getJSONObject("properties");
                            Set<String> propertiesSet = properties.keySet();
                            List<ParameterVo> childParamList = new ArrayList<>();
                            for(String key : propertiesSet) {
                                ParameterVo childParam = new ParameterVo();
                                childParam.setName(key);
                                JSONObject proMap = properties.getJSONObject(key);
                                //根据type判断是否是array
                                String type = proMap.getString("type");
                                childParam.setDescription(StringUtils.isNotBlank(proMap.getString("description"))?proMap.getString("description"):"");
                                childParam.setType(StringUtils.isBlank(type)?"object":type);
                                childParam.setFormat(proMap.getString("format"));
                                childParam.setRequired(proMap.getBooleanValue("required"));
                                if(proMap.containsKey("$ref")) {
                                    String childRef = proMap.getString("$ref");
                                    String childDef = childRef.substring(14);
                                    JSONObject childDefJson = refMap.get(childDef);
                                    JSONObject childProperties = childDefJson.getJSONObject("properties");
                                    if(childProperties != null) {
                                        getParamRef(refMap,childProperties,childParam,childDef,childDefJson);
                                    }
                                }else if("array".equalsIgnoreCase(type)) {
                                    JSONObject items = proMap.getJSONObject("items");
                                    if(items.containsKey("$ref")) {
                                        String itemRef = items.getString("$ref");
                                        String itemDef = itemRef.substring(14);
                                        JSONObject itemDefJson = refMap.get(itemDef);
                                        JSONObject pro = itemDefJson.getJSONObject("properties");
                                        if(pro != null) {
                                            getParamRef(refMap,pro,childParam,itemDef,itemDefJson);
                                        }
                                    }
                                }
                                childParamList.add(childParam);
                                param.setChildParam(childParamList);
                            }
                        }
                    }
                }
                reqParameters.add(param);
            }
        }
        return reqParameters;
    }
    
    public static List<ParameterVo> getParamRef(Map<String,JSONObject> refMap,JSONObject childProperties,ParameterVo parentResp,String parentVoName,JSONObject childJson) {
        List<ParameterVo> paramList = new ArrayList<>();
        Set<String> childSet = childProperties.keySet();
        for(String key : childSet) {
            JSONObject childMap = childProperties.getJSONObject(key);
            ParameterVo resp = new ParameterVo();
            resp.setName(key);
            resp.setFormat(childMap.getString("format"));
            resp.setDescription(childMap.getString("description"));
            String childType = childMap.getString("type");
            resp.setType(StringUtils.isNotBlank(childType)?childType:childJson.getString("type"));
            resp.setRequired(childMap.getBooleanValue("required"));
            paramList.add(resp);
            parentResp.setChildParam(paramList);
            if(childMap.containsKey("$ref")) {
                String childRef = childMap.getString("$ref");
                String childDef = childRef.substring(14);
                JSONObject childDefJson = refMap.get(childDef);
                JSONObject pro = childDefJson.getJSONObject("properties");
                //additionalProperties
                if(pro != null && !childDef.equalsIgnoreCase(parentVoName)) {
                    getParamRef(refMap,pro,resp,childDef,childDefJson);
                }
            }else if("array".equalsIgnoreCase(childType)) {
                JSONObject items = childMap.getJSONObject("items");
                if(items.containsKey("$ref")) {
                    String itemRef = items.getString("$ref");
                    String itemDef = itemRef.substring(14);
                    JSONObject itemDefJson = refMap.get(itemDef);
                    JSONObject pro = itemDefJson.getJSONObject("properties");
                    if(pro != null && !itemDef.equalsIgnoreCase(parentVoName)) {
                        getParamRef(refMap,pro,resp,itemDef,itemDefJson);
                    }
                }
            }
        }
        return paramList;
    }
    
    /**
     * 获取所有的关联参数对象
     * @param swaggerJson
     * @return
     */
    public static Map<String,JSONObject> getDefinitions(JSONObject swaggerJson){
        Map<String,JSONObject> map= new HashMap<>();
        JSONObject definitions = swaggerJson.getJSONObject("definitions");
        Set<String> definitionSet = definitions.keySet();
        for(String def : definitionSet) {
            map.put(def, definitions.getJSONObject(def));
        }
        return map;
    }
    
    public static void main(String[] args) {
        String respStr = HttpClientUtil.sendHttpGet("http://localhost:8080/v2/api-docs");
        //String respStr = "";

//swagger中的对象参数会以$ref的方式,fastjson默认会自己关联对象,导致解析时拿不到参数对象,需要DisableCircularReferenceDetect 来禁止循环引用
        JSONObject swaggerJson = JSON.parseObject(respStr,Feature.DisableCircularReferenceDetect);
        System.err.println(JSON.toJSONString(getPathInfo(swaggerJson),SerializerFeature.WriteNullStringAsEmpty));
    }
@Data
public class SwaggerInfoVo {

	private String version;
	private String title;
	private String description;
	private Map<String,Object> license;
}
import lombok.Data;

@Data
public class PathInfoVo {

	//请求路劲
	private String pathUrl;
	//请求方式
	private String httpMethod;
	private String operationId;
	//概要
	private String summary;
	//描述
	private String description;
	
	private List<ParameterVo> reqList;
	
	private List<ResponseVo> respList;
}
@Data
public class ParameterVo {

	//参数位置 path/body/query/header
	private String in;
	private String name;
	private String type;
	private String description;
	private boolean required;
	private String format;
	private List<ParameterVo> childParam;
}

@Data
public class ResponseVo {

	private String name;
	private String description;
	private String type;
	private boolean required;
	private String format;
	private List<ResponseVo> childResp;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring 解析swagger.json 的相关文章

随机推荐

  • 超全实用

    汽车领域 金融领域 由于篇幅有限 为了阅读体验本文只截取金融和汽车领域的数据存储期限汇总 其他领域如 通用 电商 工业 化妆品 医疗 游戏等行业要求在单独的汇总Excel中 可私信找我要 暗号 数据存储
  • Android 友盟集成华为,小米,魅族推送的基础实现与注意事项

    因为目前正处于实习阶段 所以公司安排了解一下华为 小米 魅族 友盟的推送 并将其集成在一个APP上 为此特地写一篇博客记录集成过程中需要注意的一些事项 如果想进行集成 建议还是先了解一下华为 小米 魅族它们自己厂商的推送服务及文档 毕竟集成
  • opencv不规则裁剪

    首先是一张卡通T袖十香 使用labelme标注 然后使用json里面标注的点坐标去裁剪 裁剪后的图片 下面附上代码 import cv2 import numpy as np opencv不规则裁剪 def ROI byMouse img
  • windows下查看端口的方法

    小编的同事昨天遇到了一个问题 在运行某个程序的时候 总提示说程序端口被占用 不能运行 这可就着急了 今天小编一系列的查看 解决了问题 今天就来教大家windows如何查看端口 从而知道端口被哪个程序占用了 然后在进行处理即可 下面我们一起来
  • VINS - Fusion GPS/VIO 融合 二、数据融合

    https zhuanlan zhihu com p 75492883 一 简介 源代码 VINS Fusion 数据集 KITTI 数据 程序入口 globalOptNode cpp 二 程序解读 2 1 主函数 int main int
  • 芯片的ATE测试简介

    ATE Automatic Test Equipment 即自动测试设备 它用于芯片大规模生产测试 保障稳健 质量 成本和进度 的供应 ATE测试基本的覆盖理念 主要是结构性测试 即Structure Test 再辅以一定的功能和性能测试
  • ch4 报错修正 & Sophus使用

    ch4 报错 修正 1 添加Eigen头文件 include directories usr include eigen3 2 include sophus so3 hpp include sophus se3 hpp 3 大量报错但都与S
  • CentOS 7安装OpenMPI

    文章目录 一 下载OpenMPI源码 二 解压缩OpenMPI源码 三 安装OpenMPI 四 配置环境变量 五 验证安装 参考资料 一 下载OpenMPI源码 wget https download open mpi org releas
  • 微前端框架 之 qiankun

    文章目录 一 介绍 1 1 qiankun的优点 特点 二 源码解读 2 1 框架目录结构 2 2 有料的 package json 2 3 示例项目中的主应用 2 4 启动示例项目 三 示例项目 3 1 主应用 3 1 1 webpack
  • video.js 报错:your browser did not support

    video js 报错 The media playback was aborted due to a corruption problem or because the media used features your browser d
  • 记vue___旧版vue项目中配置可选链和双问号语法

    新项目vue cli搭建可以直接使用可选链和双问号 旧项目的话需要借助插件解析可选链和双问号写法 babel plugin proposal optional chaining 插件可以帮助我们将可选链式的代码转化 旧项目通过babel配置
  • MySQL 关键字及保留字

    在SQL语句中出现的关键字和保留字 如果要使用人他们的字符意思而不是作为关键字 保留字使用 关键字可以正常使用 但是保留字必须使用 键盘tab键上面 数字1左边的那个按键 来分割 这个在SQLServer里面是使用 中括号实现的 所以我们要
  • typeScript--[类的实例方法与静态方法]

    这里所谓的静态方法 其实就是将方法直接定义在了 构造函数对象上 只有构造函数本身才能去使用它 任何其他都无法使用 包括它的 派生类 一 js中的实例方法和静态方法 1 实例方法 定义在构造函数内的方法就是实例方法 function A na
  • java 作业1:鸡兔同笼问题

    作业 1 鸡兔同笼问题 现在若干只鸡和若干只兔 丢在一个笼子里 从上面看有35个头 从下面看有 94只脚 问有多少只鸡和多少只兔子 package Lx public class ForTest01 public static void m
  • 建模前数据去噪方法总结

    数据在建模之前 有的时候会存在大量噪声 这个时候就需要去噪算法对原始数据进行去噪处理 目前了解到的去噪方法有 3标准差去噪 分箱去噪 dbscan去噪 孤立森林等 其中 3标准差去噪 对于正态分布的数据具有较好的去噪性能 而对于数据属于偏态
  • 【算法】零基础KMP、Trie、AC自动机

    文章目录 KMP 前后缀是什么 KMP题 AcWing 831 KMP字符串 Trie AcWing 835 Trie字符串统计 AC自动机 KMP 字符串匹配的KMP算法 前缀和后缀的详解 看这个可以理解KMP 字符串匹配的KMP算法 前
  • STM32F1系列PB3,PB4,PA13,PA14,PA15用作普通IO口的特殊配置

    最近博主用STM32F103C8T6做了一个温度测控模块 用到PB3 PB4 PA15等引脚控制外设 发现不管怎么配置 这三个引脚都不能置零 后来发现是包括这三个引脚在内的PB3 PB4 PA13 PA14 PA15是特殊的IO口 用作JT
  • CleanShot X for mac安装下载,mac系统录屏、截图、标注软件

    您是否经常需要截图 录屏或者标注图片 如果是 那么您一定会喜欢CleanShot X for mac 这是一款专为Mac用户设计的强大而简洁的工具 CleanShot X for mac可以让您轻松地截取任何区域的屏幕 无论是整个屏幕 窗口
  • [586]使用requests来爬取大众点评

    看完本文 你可以 1 了解大众点评的CSS反爬虫机制 2 破解反爬虫机制 3 使用requests即可正确获取到评论数 平均价格 服务 味道 环境数据 评论文本数据 1 前言 在工作生活中 发现越来越多的人对大众点评的数据感兴趣 而大众点评
  • spring 解析swagger.json

    微服务开发 经常会用到swagger 开发过程中也可以直接验证 测试接口是否可用 但是由于swagger不是正式的对接文档 我们提供给前端或者外部来进行联调时还是要正式的文档 为了解决这一痛点 发现swagger是通过swagger jso