json - 如何从 OpenAPI/Swagger 模型定义生成 JSON 示例?

标签 json swagger swagger-2.0 swagger-codegen openapi

我正在为具有 OpenAPI (Swagger) 定义的 REST API 构建模糊器。

我想测试 OpenAPI 定义中的所有可用路径,生成数据来测试服务器,分析响应代码和内容,并验证响应是否符合 API 定义。

我正在寻找一种从模型定义生成数据(JSON 对象)的方法。

例如,给定此模型:

...
"Pet": {
  "type": "object",
  "required": [
    "name",
    "photoUrls"
  ],
  "properties": {
    "id": {
      "type": "integer",
      "format": "int64"
    },
    "category": {
      "$ref": "#/definitions/Category"
    },
    "name": {
      "type": "string",
      "example": "doggie"
    },
    "photoUrls": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "tags": {
      "type": "array",
      "items": {
        "$ref": "#/definitions/Tag"
      }
    },
    "status": {
      "type": "string",
      "description": "pet status in the store"
    }
  }
}

我想生成随机数据并得到如下内容:

{
  "id": 0,
  "category": {
    "id": 0,
    "name": "string"
  },
  "name": "doggie",
  "photoUrls": [
    "string"
  ],
  "tags": [
    {
      "id": 0,
      "name": "string"
    }
  ],
  "status": "string"
}

最佳答案

Swagger Inflector图书馆有 ExampleBuilder类正是为了这个目的。它允许您从 OpenAPI (Swagger) 定义中的模型生成 JSON、XML 和 YAML 示例。

OpenAPI 2.0 示例

要使用 OpenAPI 2.0 (swagger: '2.0') 定义,请使用 Swagger Java 库 1.x

import io.swagger.parser.SwaggerParser;
import io.swagger.models.*;
import io.swagger.inflector.examples.*;
import io.swagger.inflector.examples.models.Example;
import io.swagger.inflector.processors.JsonNodeExampleSerializer;
import io.swagger.util.Json;
import io.swagger.util.Yaml;
import java.util.Map;
import com.fasterxml.jackson.databind.module.SimpleModule;

...

// Load your OpenAPI/Swagger definition
Swagger swagger = new SwaggerParser().read("http://petstore.swagger.io/v2/swagger.json");

// Create an Example object for the Pet model
Map<String, Model> definitions = swagger.getDefinitions();
Model pet = definitions.get("Pet");
Example example = ExampleBuilder.fromModel("Pet", pet, definitions, new HashSet<String>());
// Another way:
// Example example = ExampleBuilder.fromProperty(new RefProperty("Pet"), swagger.getDefinitions());

// Configure example serializers
SimpleModule simpleModule = new SimpleModule().addSerializer(new JsonNodeExampleSerializer());
Json.mapper().registerModule(simpleModule);
Yaml.mapper().registerModule(simpleModule);

// Convert the Example object to string

// JSON example
String jsonExample = Json.pretty(example);
System.out.println(jsonExample);

// YAML example
String yamlExample = Yaml.pretty().writeValueAsString(example);
System.out.println(yamlExample);

// XML example (TODO: pretty-print it)
String xmlExample = new XmlExampleSerializer().serialize(example);
System.out.println(xmlExample);

OpenAPI 3.0 示例

对于 OpenAPI 3.0 示例,see this answer 。您需要 Swagger Java 库的 2.x 版本,并适当更新导入和类名称,例如将 io.swagger.parser.SwaggerParser 更改为 io.swagger.v3.parser.OpenAPIV3Parser 等等。

关于json - 如何从 OpenAPI/Swagger 模型定义生成 JSON 示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41408768/

相关文章:

java - 为 @ApiOperations 为 springfox swagger2 定义自定义 json 序列化器

java - 有没有办法通过swagger注释为不同端点资源使用的模型类编写不同的文档?

java - 处理 JSONObject 以获取项目

swagger - 如何在OpenAPI(Swagger)中为相同的HTTP状态代码定义不同的响应?

Swagger 引用外部文件中的定义

datetime - 带有时区信息的 OpenAPI DateTime

Swagger + Nest.js 不会删除空的 DTO 和模型

javascript - 需要将html标签存储在json文件中

javascript - 使用递归和 for 循环解析 JSON

json - Postgres 9.3 JSON 输出多维对象