70

I created an API spec from some JSON files and I am trying to test if the files validate against the API spec.

There are some good tools to validate against JSON Schema, but I did not have chance to find a tool to validate against specs created in the Swagger (tool for creating API schema). The only solution I found is generating a client/server in the Swagger-Editor, it is quite cumbersome.

Is there already an existing tool to validate JSON against Swagger Schema?

Peter G.
  • 7,816
  • 20
  • 80
  • 154

5 Answers5

38

Arnaud in the comments is correct that there are two separate questions here.

Do you want to validate that your spec is a valid OpenAPI (fka. Swagger) spec

You can

  • Copy your spec to the online Swagger editor and it will throw errors. A quick dive through the source doesn't tell me what it's using to create those errors, but it doesn't seem to be contacting a server to do it...
  • Use the official swagger-parser for Java.
  • Use the unofficial swagger-parser for JavaScript (browser or Node).

or validate that an implementation of this spec would produce JSON which is valid regarding your JSON schemas?

In other words, here's some JSON from a request or response body, is it correct?

Swagger relies on another standard called JSON Schema for its schema objects, which are what actually describes the JSON (rather than endpoints or metadata). Swagger uses a subset of JSON Schema (missing: oneOf, patternProperties, among others). To that end, you can use a JSON Schema validator. There are 37 listed here; I'll give a shoutout to this online validator that also supports YAML schemas.

But, when I said Swagger relies on a subset of JSON API, I lied. There are a handful of fixed fields that have special meaning in Swagger that's not part of JSON Schema. One of them is discriminator which is used for polymorphism. I am not aware of a Swagger validator that can process discriminator. There are a fair number of tools for swagger and some claim to do validations, but many are abandonware, meant for old versions, not feature-complete, tied to other technologies, and so on. If there's a mature and well-maintained library that I'm missing, I'd love to know.

mgold
  • 6,189
  • 4
  • 39
  • 41
  • 1
    I am having the same situation and this was helpful. With a bit of work, I was able to write my own scripts that can validate my server's response payload with the JSON Schema defined by Swagger. I wrote some Express middlware to do that. Instead of trying to use Swagger to do what I want, I can use the schema object it relies on. Thanks! – Tina Apr 07 '17 at 15:41
  • For the second one, how would I implement it without using an external schema validator? I just want to validate an instance of a schema against a (swagger) schema. How would I do that? Thanks. – Nikhita Raghunath May 08 '17 at 15:01
  • internally it looks like swagger is using the z-schema json validator, so theoretically you would look at that to see what features are available? https://github.com/zaggino/z-schema – chrismarx Jan 15 '18 at 16:59
  • This solution is not worked for me. Intentionally removed path param declaration and tested. It did not complaining that the path param missed. It's just validating the well formed json or not. – Paramesh Korrakuti Nov 04 '18 at 04:42
  • Yes, Open API Schema (Swagger) doesn't equal JSON Schema. Swagger Schema has some extended keywords which are not supported by json schema standard. You can check swagger docs: https://swagger.io/docs/specification/data-models/keywords/ – Klyuch Nov 10 '22 at 17:37
4

Atlassian's swagger-request-validator is a Java library that can do such validation:

A Java library for validating request/responses against a OpenAPI / Swagger specification. Includes support for Swagger v2 and OpenAPI v3 specifications and adapters for common mock and testing libraries.

The core library is not tied to any specific HTTP library, but they also provide additional modules that integrate with Spring MVC, MockMVC, REST Assured etc.

There is also swagger-schema-validator that can validate a JSON document against a Swagger V2 definition (disclaimer: I'm the author). This Java library is less complete than Atlassian's though.

Bastien Jansen
  • 8,756
  • 2
  • 35
  • 53
1

If your Swagger JSON is hosted, you could use the following url: http://online.swagger.io/validator/debug?url=your_url

josephpconley
  • 1,703
  • 12
  • 12
1

swagger validation with Java

Minimal java code to do offline validation of a .json payload file against a .yaml swagger spec using https://github.com/bjansen/swagger-schema-validator:

  1. Reference the dependencies in your own project as described in the swagger-schema-validator readme or clone locally with git clone https://github.com/bjansen/swagger-schema-validator.git.

  2. Copy your .yaml and .json files into the src/test/resources folder under your test root folder.

  3. Create a test class containing something along the lines (make sure to change "/definitions/MyPayloadObjectMustBeSetHere" to point to your own definition):

import com.github.bjansen.ssv.SwaggerValidator;
import com.github.fge.jsonschema.core.report.ProcessingReport;
import static org.junit.jupiter.api.Assertions.assertEquals;

@Test
void SwaggerSpecTest() {
    InputStream spec = getClass().getResourceAsStream("/api/swagger.yaml");
    SwaggerValidator validator = SwaggerValidator.forYamlSchema(new InputStreamReader(spec));

    InputStreamReader sample = new InputStreamReader(getClass().getResourceAsStream("/api/payload.json"));
    ProcessingReport report = validator.validate(CharStreams.toString(sample), "/definitions/MyPayloadObjectMustBeSetHere");
    assertEquals("success", report.toString()); // force printing the errors/warnings
}
ccpizza
  • 28,968
  • 18
  • 162
  • 169
-1

The OpenAPI 2.0 / Swagger schema is available in a few places, it's just a bit hard to find because of the heavy use of the word 'schema' in swagger itself.

So you can point a generic validator at this schema and your document. For example, this works nicely for me using vscode and Red Hat's YAML extension.

Michael
  • 955
  • 4
  • 12