LogoLogo

Schema Benchmarks

    • home
      Home

    • download_2
      Download

    • timer
      Initialization
    • check_circle
      Validation
    • output_circle
      Parsing
    • swap_horiz
      Codec
    • schema
      Standard Schema
    • format_quote
      String

    • error
      Stack

  • JSON Schema

    • data_object
      Schema to JSON
    • code
      JSON to Schema
    • verified
      Compliance

    • deployed_code
      Libraries

    • article
      Blog
Expand sidebarExpand sidebar
JSON Schema/ComplianceCompliance
github
GitHubGitHub
DiscordDiscord
PreferencesPreferences

Using the JSON Schema Test Suite, we test each library against the official JSON Schema specification. The test suite contains a large number of test cases that cover various aspects of JSON Schema validation, including different data types, formats, and validation rules.

Target
  • data_objectDraft 2019-09
  • data_objectDraft 2020-12
  • data_objectDraft 3
  • data_objectDraft 4
  • data_objectDraft 6
  • data_objectDraft 7
  • data_objectV1
checklistValidationbookSemanticsreplayRoundtrip

Libraries that use JSON Schema directly, such as typebox or ajv.

Copy to clipboardCopy to clipboard
const receivedValid = Schema.Check(schema, data); assert(receivedValid === expectedValid);

Results indicate compliance with the JSON Schema test suite.

LibrarysortVersionSourcedownload/wkarrow_upwardCompliancesort
@cfworker/json-schema
Code snippetCode snippet
const validator = new Validator(schema);
for (const [uri, remoteSchema] of Object.entries(remotes)) {
  validator.addSchema(remoteSchema, uri);
}
return validator.validate(data).valid;
4.1.1Native7.47M90.1% (502 / 557)
checklist
Open detailsOpen details
ajv
Code snippetCode snippet
const ajv = new Ajv({ validateSchema: false });
addFormats(ajv);
for (const [uri, remoteSchema] of Object.entries(remotes)) {
  ajv.addSchema(remoteSchema, uri);
}
return ajv.validate(schema, data)
8.20.0Nativen/a14.2% (79 / 557)
checklist
Open detailsOpen details
ajv (non-strict)
Code snippetCode snippet
const ajv = new Ajv({ strict: false, validateSchema: false });
addFormats(ajv);
for (const [uri, remoteSchema] of Object.entries(remotes)) {
  ajv.addSchema(remoteSchema, uri);
}
return ajv.validate(schema, data)
8.20.0Nativen/a84.7% (472 / 557)
checklist
Open detailsOpen details
ata-validator
Code snippetCode snippet
new Validator(schema, { schemas }).isValidObject(data)
1.6.2Nativen/a83.7% (466 / 557)
checklist
Open detailsOpen details
jsonschema
Code snippetCode snippet
const validator = new Validator();
for (const [uri, remoteSchema] of Object.entries(remotes)) {
  validator.addSchema(remoteSchema, uri);
}
return validator.validate(data, schema).valid;
1.5.0Nativen/a96.6% (538 / 557)
checklist
Open detailsOpen details
typebox (schema)
Code snippetCode snippet
Schema.Check(remotes, schema, data)
1.3.16Nativen/a90.5% (504 / 557)
checklist
Open detailsOpen details
typebox (value)
Code snippetCode snippet
Value.Check(remotes, schema, data)
1.3.16Nativen/a90.5% (504 / 557)
checklist
Open detailsOpen details
z-schema
Code snippetCode snippet
const validator = ZSchema.create({ safe: true });
for (const [uri, remoteSchema] of Object.entries(remotes)) {
  validator.setRemoteReference(uri, remoteSchema);
}
return validator.validate(data, schema).valid;
12.4.2Nativen/a86% (479 / 557)
checklist
Open detailsOpen details

Libraries that have their own representations of schemas, but can be created from JSON Schema, such as zod or arktype.

Copy to clipboardCopy to clipboard
const zodSchema = z.fromJSONSchema(schema); const receivedValid = zodSchema.safeParse(data).success; assert(receivedValid === expectedValid);

Results indicate how closely the library aligns with the formal semantics of JSON Schema.

LibrarysortVersionSourcedownload/wkarrow_upwardCompliancesort
@cfworker/json-schema
Code snippetCode snippet
const validator = new Validator(schema);
for (const [uri, remoteSchema] of Object.entries(remotes)) {
  validator.addSchema(remoteSchema, uri);
}
return validator.validate(data).valid;
4.1.1Native7.47M90.1% (502 / 557)
checklist
Open detailsOpen details
ajv
Code snippetCode snippet
const ajv = new Ajv({ validateSchema: false });
addFormats(ajv);
for (const [uri, remoteSchema] of Object.entries(remotes)) {
  ajv.addSchema(remoteSchema, uri);
}
return ajv.validate(schema, data)
8.20.0Nativen/a14.2% (79 / 557)
checklist
Open detailsOpen details
ajv (non-strict)
Code snippetCode snippet
const ajv = new Ajv({ strict: false, validateSchema: false });
addFormats(ajv);
for (const [uri, remoteSchema] of Object.entries(remotes)) {
  ajv.addSchema(remoteSchema, uri);
}
return ajv.validate(schema, data)
8.20.0Nativen/a84.7% (472 / 557)
checklist
Open detailsOpen details
ata-validator
Code snippetCode snippet
new Validator(schema, { schemas }).isValidObject(data)
1.6.2Nativen/a83.7% (466 / 557)
checklist
Open detailsOpen details
jsonschema
Code snippetCode snippet
const validator = new Validator();
for (const [uri, remoteSchema] of Object.entries(remotes)) {
  validator.addSchema(remoteSchema, uri);
}
return validator.validate(data, schema).valid;
1.5.0Nativen/a96.6% (538 / 557)
checklist
Open detailsOpen details
typebox (schema)
Code snippetCode snippet
Schema.Check(remotes, schema, data)
1.3.16Nativen/a90.5% (504 / 557)
checklist
Open detailsOpen details
typebox (value)
Code snippetCode snippet
Value.Check(remotes, schema, data)
1.3.16Nativen/a90.5% (504 / 557)
checklist
Open detailsOpen details
z-schema
Code snippetCode snippet
const validator = ZSchema.create({ safe: true });
for (const [uri, remoteSchema] of Object.entries(remotes)) {
  validator.setRemoteReference(uri, remoteSchema);
}
return validator.validate(data, schema).valid;
12.4.2Nativen/a86% (479 / 557)
checklist
Open detailsOpen details

Libraries that can be converted from and to JSON Schema. The JSON schema is decoded to the library's internal representation, then re-encoded to JSON Schema. The result is fed to typebox for final validation (as it scores highest on validation benchmarks, so introduces the smallest amount of margin of error).

Copy to clipboardCopy to clipboard
const zodSchema = z.fromJSONSchema(schema); const roundtripSchema = z.toJSONSchema(zodSchema, { target: "draft-07" }); const receivedValid = Schema.Check(roundtripSchema, data); assert(receivedValid === expectedValid);

Failed tests indicate either lossy translation or a serialization error.

LibrarysortVersionSourcedownload/wkarrow_upwardCompliancesort
@cfworker/json-schema
Code snippetCode snippet
const validator = new Validator(schema);
for (const [uri, remoteSchema] of Object.entries(remotes)) {
  validator.addSchema(remoteSchema, uri);
}
return validator.validate(data).valid;
4.1.1Native7.47M90.1% (502 / 557)
checklist
Open detailsOpen details
ajv
Code snippetCode snippet
const ajv = new Ajv({ validateSchema: false });
addFormats(ajv);
for (const [uri, remoteSchema] of Object.entries(remotes)) {
  ajv.addSchema(remoteSchema, uri);
}
return ajv.validate(schema, data)
8.20.0Nativen/a14.2% (79 / 557)
checklist
Open detailsOpen details
ajv (non-strict)
Code snippetCode snippet
const ajv = new Ajv({ strict: false, validateSchema: false });
addFormats(ajv);
for (const [uri, remoteSchema] of Object.entries(remotes)) {
  ajv.addSchema(remoteSchema, uri);
}
return ajv.validate(schema, data)
8.20.0Nativen/a84.7% (472 / 557)
checklist
Open detailsOpen details
ata-validator
Code snippetCode snippet
new Validator(schema, { schemas }).isValidObject(data)
1.6.2Nativen/a83.7% (466 / 557)
checklist
Open detailsOpen details
jsonschema
Code snippetCode snippet
const validator = new Validator();
for (const [uri, remoteSchema] of Object.entries(remotes)) {
  validator.addSchema(remoteSchema, uri);
}
return validator.validate(data, schema).valid;
1.5.0Nativen/a96.6% (538 / 557)
checklist
Open detailsOpen details
typebox (schema)
Code snippetCode snippet
Schema.Check(remotes, schema, data)
1.3.16Nativen/a90.5% (504 / 557)
checklist
Open detailsOpen details
typebox (value)
Code snippetCode snippet
Value.Check(remotes, schema, data)
1.3.16Nativen/a90.5% (504 / 557)
checklist
Open detailsOpen details
z-schema
Code snippetCode snippet
const validator = ZSchema.create({ safe: true });
for (const [uri, remoteSchema] of Object.entries(remotes)) {
  validator.setRemoteReference(uri, remoteSchema);
}
return validator.validate(data, schema).valid;
12.4.2Nativen/a86% (479 / 557)
checklist
Open detailsOpen details
Created by eskimojo for Open Circle

Preferences

Style
Theme
NPM browser
Code ligatures