To ensure your JSON data adheres to a specific structure using a JSON Schema validator online for the 2020-12 draft, here are the detailed steps to follow for a smooth validation process:
- Step 1: Access the Online Validator. Navigate to an online JSON Schema validator that explicitly supports the Draft 2020-12 specification. Many tools, like the one you’re using, will clearly state their supported draft version. This is crucial because schema drafts introduce new keywords and functionalities.
- Step 2: Input Your JSON Schema.
- Locate the input area for your JSON Schema (often labeled “JSON Schema” or “Schema Definition”).
- Paste your complete JSON Schema definition into this text area. Ensure it’s valid JSON itself. For example, if you’re defining a
product
object, your schema might start with{"$schema": "https://json-schema.org/draft/2020-12/schema", "title": "Product", ...}
.
- Step 3: Provide Your JSON Data.
- Find the input section for the JSON data you wish to validate (commonly labeled “JSON Data to Validate” or “Instance Data”).
- Paste the JSON data you want to check against your schema. This is the
json-schema-validator example
data you’re testing.
- Step 4: Initiate Validation. Click the “Validate” or “Run Validation” button. The online tool will process your schema and data.
- Step 5: Review Results.
- The validator will display the outcome, typically in a “Validation Results” or “Output” section.
- If your data is valid, you’ll see a success message.
- If there are validation errors, the tool will provide a detailed report, often indicating the exact path in your JSON data where the error occurred and the schema rule that was violated. This is especially helpful for complex scenarios like
json schema validation oneof example
, where understanding which specific subschema was matched or failed is key.
- Step 6: Iterate and Refine. Based on the validation results, adjust either your JSON data or your JSON Schema until all errors are resolved and your data consistently meets the schema’s requirements. Remember, the 2020-12 draft brings new features and clarifications, so ensure your schema utilizes these correctly.
Understanding JSON Schema Draft 2020-12: A Deep Dive
JSON Schema is a powerful tool for defining the structure, content, and format of JSON data. It acts as a contract for data, ensuring consistency and reliability across systems. The Draft 2020-12, released in December 2020, represents the latest stable iteration, bringing significant enhancements and clarifications over previous versions like Draft 7. For developers and data architects, mastering this draft is crucial for building robust and future-proof data validation pipelines. This section will explore the core concepts and new features of Draft 2020-12, providing practical insights and examples.
The Evolution and Importance of JSON Schema
JSON (JavaScript Object Notation) has become the de facto standard for data exchange on the web and in countless applications due to its simplicity and readability. However, without a formal way to describe its structure, ensuring data consistency and correctness can be challenging. This is where JSON Schema steps in.
JSON Schema provides a standardized way to:
- Validate data: Ensure incoming or outgoing data conforms to expected patterns.
- Document data: Create clear, human-readable documentation for JSON data structures.
- Automate processes: Generate forms, code, or user interfaces based on schema definitions.
The evolution of JSON Schema, from Draft 3 to Draft 2020-12, reflects the growing needs of developers and the increasing complexity of data structures. Each new draft refines existing keywords, introduces new capabilities, and clarifies ambiguities. Draft 2020-12, in particular, focuses on improving applicator keywords and introducing unevaluated properties/items for more precise schema evolution.
0.0 out of 5 stars (based on 0 reviews)
There are no reviews yet. Be the first one to write one. |
Amazon.com:
Check Amazon for Json schema validator Latest Discussions & Reviews: |
Key Features and Improvements in Draft 2020-12
Draft 2020-12 is not a radical overhaul but a significant refinement. It consolidates many experimental features from previous drafts, formalizes best practices, and introduces new capabilities that enhance schema expressiveness. Json online validator and formatter
The $vocabulary
Keyword
One of the most notable additions is the $vocabulary
keyword. This keyword allows a schema to explicitly declare which vocabularies (sets of keywords) it uses. This is a powerful feature for:
- Modularity: Schemas can become more modular by specifying only the necessary vocabularies.
- Future-proofing: Tools can better understand which keywords to expect, making schemas more robust against future changes in the standard.
- Reduced ambiguity: It provides a clear declaration of intent.
Example:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$vocabulary": {
"https://json-schema.org/draft/2020-12/vocab/core": true,
"https://json-schema.org/draft/2020-12/vocab/applicator": true
},
"type": "object",
"properties": {
"name": { "type": "string" }
}
}
This schema explicitly states it uses the core and applicator vocabularies of Draft 2020-12.
unevaluatedProperties
and unevaluatedItems
These are game-changers for robust schema evolution and “closed” schemas. In earlier drafts, ensuring that no extra properties or no extra items were present in an object or array, respectively, was often clunky.
unevaluatedProperties
: This keyword applies schema validation to any properties that were not “evaluated” by other keywords likeproperties
,patternProperties
, oradditionalProperties
. This is extremely useful for strictly defined objects where you want to allow only explicitly defined properties or only properties that match certain patterns.unevaluatedItems
: Similarly, this applies to array items that were not evaluated byitems
(when it’s a schema) orprefixItems
(which replacesitems
when it’s an array of schemas).
Example (unevaluatedProperties
):
Let’s say you have a schema for a user profile, and you want to ensure no extra fields creep in that you haven’t explicitly allowed or handled. Best free online courses
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"username": { "type": "string" },
"email": { "type": "string", "format": "email" }
},
"unevaluatedProperties": false
}
In this json-schema-validator example
, if a JSON instance has { "username": "test", "email": "[email protected]", "age": 30 }
, the age
property would cause a validation error because unevaluatedProperties
is set to false
.
prefixItems
(Replacing items
for Tuples)
In previous drafts, the items
keyword served a dual purpose: it could define a schema for all array items (list validation) or an array of schemas for specific positions (tuple validation). Draft 2020-12 introduces prefixItems
to clearly delineate tuple validation.
prefixItems
: An array of schemas that applies to array items in order. The first schema applies to the first item, the second to the second, and so on. This is whatitems
used to do for tuple validation.items
: Now exclusively defines the schema for all additional items after those defined byprefixItems
. Ifitems
is absent, no additional items are allowed.
Example:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "array",
"prefixItems": [
{ "type": "string" },
{ "type": "integer" },
{ "type": "boolean" }
],
"items": { "type": "number" }
}
Valid data: ["hello", 123, true, 3.14, 2.71]
Invalid data: ["hello", 123, true, "not a number"]
(because the fourth item must be a number as per items
)
Invalid data: ["hello", 123, "not a boolean"]
(because the third item must be a boolean as per prefixItems
)
Renamed Keywords
To improve clarity and consistency, some keywords have been renamed: Best free online jigsaw puzzles
definitions
is now$defs
: This aligns better with other keywords like$ref
,$id
, etc., indicating that it’s a structural keyword for defining reusable schemas.propertyNames
is nowdependentSchemas
: This keyword specifies a schema that must be applied when a particular property is present. This is a subtle but important change that improves the precision of schema composition.
Example ($defs
):
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$defs": {
"address": {
"type": "object",
"properties": {
"street": { "type": "string" },
"city": { "type": "string" }
},
"required": ["street", "city"]
}
},
"type": "object",
"properties": {
"shippingAddress": { "$ref": "#/$defs/address" },
"billingAddress": { "$ref": "#/$defs/address" }
}
}
This json-schema-validator example
clearly shows how $defs
is used for defining reusable subschemas.
New Keywords: if
, then
, else
for Conditional Logic
While if
/then
/else
were introduced in Draft 7, their importance is paramount for complex validation scenarios. They allow you to apply different validation rules based on conditions within your data. This helps achieve sophisticated json schema validation oneof example
patterns without resorting to overly complex oneOf
/anyOf
structures.
Example:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"paymentMethod": { "type": "string", "enum": ["creditCard", "paypal"] },
"cardNumber": { "type": "string" },
"paypalEmail": { "type": "string", "format": "email" }
},
"if": {
"properties": { "paymentMethod": { "const": "creditCard" } }
},
"then": {
"required": ["cardNumber"],
"not": { "required": ["paypalEmail"] }
},
"else": {
"required": ["paypalEmail"],
"not": { "required": ["cardNumber"] }
}
}
This schema dictates that if paymentMethod
is creditCard
, cardNumber
is required, and paypalEmail
is not. Otherwise (e.g., for paypal
), paypalEmail
is required, and cardNumber
is not. This is a more explicit and readable way to handle conditional logic compared to solely relying on oneOf
for such scenarios. Is unix timestamp utc
Practical Use Cases for JSON Schema Draft 2020-12
The robust features of Draft 2020-12 make it indispensable for various applications, from API development to data processing.
API Request/Response Validation
For APIs, JSON Schema ensures that:
- Incoming requests conform to the API’s expected input structure, preventing malformed data from reaching the backend.
- Outgoing responses adhere to documented structures, guaranteeing clients receive data in a predictable format.
- This significantly reduces bugs and improves the reliability of microservices architectures. Many companies report a 30% reduction in API-related bugs after implementing strict JSON Schema validation.
Configuration File Validation
Many applications rely on JSON for configuration. Using JSON Schema, you can:
- Define the structure of configuration files, ensuring all necessary parameters are present and correctly formatted.
- Provide clear error messages to users when their configuration is incorrect.
- This is especially valuable for open-source projects or complex software with many configurable options.
Data Interchange and ETL Processes
When data is exchanged between different systems or transformed in Extract, Transform, Load (ETL) pipelines:
- JSON Schema acts as a critical checkpoint, ensuring data integrity at each stage.
- It helps catch data discrepancies early, preventing corrupted data from propagating through the system.
- This is vital for data lakes and data warehousing initiatives where data quality directly impacts analytics and business intelligence.
Code Generation and Documentation
Tools can leverage JSON Schema to: Thousands separator in excel
- Generate client-side code (e.g., TypeScript interfaces, client-side validation forms) directly from schema definitions.
- Automate documentation generation, providing up-to-date and accurate descriptions of data models.
- This reduces manual effort and keeps documentation in sync with the actual data structure. Some development teams report up to a 25% increase in developer productivity due to automated code and documentation generation from schemas.
Deep Dive: oneOf
, anyOf
, allOf
, not
for Advanced Composition
These powerful keywords are fundamental for defining complex relationships and choices within your JSON data. Draft 2020-12 clarifies their behavior and interaction with other keywords.
oneOf
(Exactly One Match)
The oneOf
keyword validates that the instance data is valid against exactly one of the subschemas listed. This is perfect for defining mutually exclusive options. This is a common json schema validation oneof example
.
Example:
Imagine a contact
object that can be either a person
or an organization
, but not both.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "Contact Information",
"oneOf": [
{
"title": "Person Contact",
"type": "object",
"properties": {
"type": { "const": "person" },
"firstName": { "type": "string" },
"lastName": { "type": "string" },
"email": { "type": "string", "format": "email" }
},
"required": ["type", "firstName", "lastName", "email"],
"additionalProperties": false
},
{
"title": "Organization Contact",
"type": "object",
"properties": {
"type": { "const": "organization" },
"organizationName": { "type": "string" },
"website": { "type": "string", "format": "uri" }
},
"required": ["type", "organizationName"],
"additionalProperties": false
}
]
}
Valid Data:
{
"type": "person",
"firstName": "John",
"lastName": "Doe",
"email": "[email protected]"
}
Valid Data: Hex to cmyk pantone
{
"type": "organization",
"organizationName": "Acme Corp",
"website": "http://www.acmecorp.com"
}
Invalid Data (fails oneOf
because it matches zero or multiple):
{
"type": "person",
"firstName": "John",
"lastName": "Doe"
// Missing email, so it doesn't match the "Person Contact" schema fully
// And it doesn't match "Organization Contact" either
}
Invalid Data (fails oneOf
because it matches multiple – in a real scenario, this specific example would fail additionalProperties
too):
{
"type": "person",
"firstName": "John",
"lastName": "Doe",
"email": "[email protected]",
"organizationName": "Acme Corp"
}
Here, the type
property helps ensure only one schema matches. If the type
wasn’t present, oneOf
would be harder to satisfy with such simple schemas if both person
and organization
schemas had string
properties that might overlap. It’s often recommended to include a discriminator property (like type
in this example) when using oneOf
for clarity.
anyOf
(One or More Matches)
The anyOf
keyword validates that the instance data is valid against at least one of the subschemas listed. It’s less strict than oneOf
and is useful when an object can conform to several different, non-exclusive structures.
Example:
A document can have either a createdDate
or a lastModifiedDate
, or both. Rgb to hex js
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"title": { "type": "string" }
},
"anyOf": [
{ "required": ["createdDate"] },
{ "required": ["lastModifiedDate"] }
],
"properties": {
"createdDate": { "type": "string", "format": "date-time" },
"lastModifiedDate": { "type": "string", "format": "date-time" }
}
}
Valid Data:
{
"title": "My Document",
"createdDate": "2023-01-01T10:00:00Z"
}
Valid Data:
{
"title": "My Document",
"lastModifiedDate": "2023-01-02T11:00:00Z"
}
Valid Data:
{
"title": "My Document",
"createdDate": "2023-01-01T10:00:00Z",
"lastModifiedDate": "2023-01-02T11:00:00Z"
}
Invalid Data:
{
"title": "My Document"
// Neither createdDate nor lastModifiedDate is present
}
allOf
(All Must Match)
The allOf
keyword validates that the instance data is valid against all of the subschemas listed. This is effectively a way to combine multiple schemas into one, allowing for modularity and reusability. It’s useful when you want to layer different sets of rules. Rgb to hexadecimal color converter
Example:
A user
object must be valid as a person
AND an employee
.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "Employee Profile",
"allOf": [
{
"title": "Person Base",
"type": "object",
"properties": {
"firstName": { "type": "string" },
"lastName": { "type": "string" }
},
"required": ["firstName", "lastName"]
},
{
"title": "Employee Details",
"type": "object",
"properties": {
"employeeId": { "type": "integer" },
"department": { "type": "string" }
},
"required": ["employeeId", "department"]
}
]
}
Valid Data:
{
"firstName": "Jane",
"lastName": "Doe",
"employeeId": 12345,
"department": "Engineering"
}
Invalid Data:
{
"firstName": "Jane",
"lastName": "Doe"
// Missing employeeId and department from the second schema
}
allOf
effectively merges the properties and requirements of all subschemas.
not
(Must Not Match)
The not
keyword validates that the instance data is not valid against the given subschema. This is useful for defining exclusions or preventing certain patterns. Xml value example
Example:
A product
cannot have a status
of “discontinued” if its available
flag is true.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"name": { "type": "string" },
"status": { "type": "string" },
"available": { "type": "boolean" }
},
"not": {
"allOf": [
{ "properties": { "status": { "const": "discontinued" } } },
{ "properties": { "available": { "const": true } } }
]
}
}
Valid Data:
{
"name": "Widget A",
"status": "in_stock",
"available": true
}
Valid Data:
{
"name": "Widget B",
"status": "discontinued",
"available": false
}
Invalid Data:
{
"name": "Widget C",
"status": "discontinued",
"available": true
// This combination is explicitly disallowed by 'not'
}
Using not
effectively defines “forbidden” states or combinations. Decode base64
Advanced Keywords and Concepts in Draft 2020-12
Beyond the core improvements, Draft 2020-12 refines how schemas are identified and referenced, and introduces concepts for better extensibility.
$id
and $ref
for Schema Identification and Reusability
These keywords are crucial for building modular and reusable schemas.
$id
: Defines a unique base URI for a schema. This URI identifies the schema and establishes a resolution scope for relative$ref
s within it. It’s like giving your schema a unique web address.$ref
: Used to reference another schema or a part of another schema. This allows you to avoid repetition and build complex schemas from smaller, manageable components.
Example:
If you have a base address schema in https://example.com/schemas/address.json
:
{
"$id": "https://example.com/schemas/address.json",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"street": { "type": "string" },
"city": { "type": "string" },
"zip": { "type": "string" }
},
"required": ["street", "city", "zip"]
}
You can reference it in another schema:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"customerName": { "type": "string" },
"shippingAddress": { "$ref": "https://example.com/schemas/address.json" }
},
"required": ["customerName", "shippingAddress"]
}
The $ref
keyword can also point to parts of the same schema using JSON Pointers, like "$ref": "#/$defs/myDefinition"
. Text regexmatch power query
anchor
and dynamicRef
for Recursive Schemas
Draft 2020-12 introduces the concept of dynamic referencing, which addresses limitations of static $ref
for truly recursive schemas.
$anchor
: Provides a fragment identifier for a schema within a document, similar toid
attributes in HTML. It’s essentially a local$id
.$dynamicRef
: A new form of$ref
that enables recursive schema definitions. Unlike$ref
, which resolves statically,$dynamicRef
resolves based on the current evaluation path, allowing for infinitely recursive structures like linked lists or tree-like data.$dynamicAnchor
: Paired with$dynamicRef
, it marks a point in the schema that can be dynamically referenced.
Example (Simplified Recursive Structure using $dynamicRef
):
Consider a schema for a nested comment system. A comment can have replies, which are also comments.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://example.com/schemas/comment.json",
"$ref": "#/$defs/comment",
"$defs": {
"comment": {
"$dynamicAnchor": "comment",
"type": "object",
"properties": {
"author": { "type": "string" },
"text": { "type": "string" },
"replies": {
"type": "array",
"items": { "$dynamicRef": "#comment" } // Dynamically refers to the 'comment' anchor
}
},
"required": ["author", "text"]
}
}
}
Valid Data:
{
"author": "Alice",
"text": "Great post!",
"replies": [
{
"author": "Bob",
"text": "Thanks Alice!",
"replies": [
{
"author": "Charlie",
"text": "Agreed!"
}
]
},
{
"author": "Dave",
"text": "Interesting perspective."
}
]
}
This powerful feature allows for much more flexible and correct definitions of self-referential data structures.
dependentRequired
and dependentSchemas
These keywords handle conditional requirements and schema application. Free online vector drawing program
dependentRequired
: If a specified property is present, then a list of other properties must also be present.dependentSchemas
: If a specified property is present, then a given subschema must also apply to the instance. This is more powerful thandependentRequired
as it can impose complex validation rules, not just presence.
Example (dependentRequired
):
If creditCardNumber
is present, creditCardExpiry
and creditCardCvv
must also be present.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"paymentType": { "type": "string" },
"creditCardNumber": { "type": "string", "pattern": "^[0-9]{16}$" },
"creditCardExpiry": { "type": "string", "pattern": "^(0[1-9]|1[0-2])\\/[0-9]{2}$" },
"creditCardCvv": { "type": "string", "pattern": "^[0-9]{3,4}$" }
},
"dependentRequired": {
"creditCardNumber": ["creditCardExpiry", "creditCardCvv"]
}
}
Valid Data:
{
"paymentType": "paypal"
}
Valid Data:
{
"paymentType": "credit_card",
"creditCardNumber": "1234567890123456",
"creditCardExpiry": "12/25",
"creditCardCvv": "123"
}
Invalid Data:
{
"paymentType": "credit_card",
"creditCardNumber": "1234567890123456"
// Missing creditCardExpiry and creditCardCvv
}
Other Important Keywords
title
anddescription
: Provide human-readable metadata about the schema or a part of it. Essential for documentation and user interface generation.examples
: An array of valid JSON instances that should conform to the schema. Useful for documentation and testing.default
: A default value for the instance when it’s not present. (Note: validation tools typically don’t add this default value to the instance; it’s a hint).readOnly
,writeOnly
: Hints for API tools about whether a property should be used for reading or writing.deprecated
: Marks a property or schema as deprecated, indicating it might be removed in future versions.type
: Defines the expected JSON data type (e.g.,"string"
,"number"
,"integer"
,"boolean"
,"array"
,"object"
,"null"
).enum
: Specifies a fixed set of allowed values for an instance.const
: Specifies that the instance must be exactly equal to a single value.- String Keywords:
minLength
,maxLength
,pattern
,format
(e.g.,date-time
,email
,uri
). - Numeric Keywords:
minimum
,maximum
,exclusiveMinimum
,exclusiveMaximum
,multipleOf
. - Object Keywords:
properties
,patternProperties
,additionalProperties
,required
,minProperties
,maxProperties
. - Array Keywords:
minItems
,maxItems
,uniqueItems
,contains
,minContains
,maxContains
.
Best Practices for Writing Effective JSON Schemas (Draft 2020-12)
Crafting good JSON schemas isn’t just about syntax; it’s about clarity, maintainability, and reusability. Here are some best practices: Random iphone 14 serial number
Start with $schema
and $id
Always declare the $schema
keyword at the root of your schema to specify which draft version you’re using. For Draft 2020-12, it’s https://json-schema.org/draft/2020-12/schema
. If your schema is intended to be referenced by others, define a clear $id
. This is crucial for consistent resolution of references.
Use title
and description
Extensively
These keywords are invaluable for self-documenting schemas. A well-titled and described schema is easier for humans to understand and use, especially as schema complexity grows. Think of them as inline comments for your data structure.
Embrace Modularity with $defs
and $ref
Break down complex schemas into smaller, reusable components using $defs
(the new $definitions
). This promotes:
- Reusability: Define a common address schema once and reference it wherever an address is needed.
- Readability: Complex schemas become easier to digest when broken into logical parts.
- Maintainability: Changes to a common component only need to be made in one place.
Leverage Applicator Keywords (oneOf
, anyOf
, allOf
) Wisely
These keywords are incredibly powerful for defining complex relationships and conditional logic.
- Use
oneOf
when you need strict mutual exclusivity (e.g., “choose A OR B, but not both”). - Use
anyOf
when at least one option must be true (e.g., “A OR B, or both, is acceptable”). - Use
allOf
when you need to combine properties or rules from multiple subschemas (e.g., “must conform to schema A AND schema B”). - Consider
if
/then
/else
for truly conditional logic where the presence or value of one property dictates rules for others. This can often be more readable than nestedoneOf
/anyOf
structures for certain scenarios.
Apply unevaluatedProperties
and unevaluatedItems
for Strictness
If you want to ensure that no extra properties or array items appear in your JSON data beyond what you’ve explicitly defined or allowed, set unevaluatedProperties: false
or unevaluatedItems: false
. This creates “closed” schemas, which are excellent for preventing unexpected data from entering your system. Random iphone 15 serial number
Validate Data Types Precisely
Always specify the type
for each property (string
, number
, integer
, boolean
, array
, object
, null
). This is the most fundamental level of validation. Use format
(e.g., email
, date-time
, uri
) for stronger semantic validation of strings.
Define required
Properties
Explicitly list required
properties within an object. This ensures that critical fields are always present.
Test Your Schemas Thoroughly
Use an online json schema validator online 2020 12
tool or a local validation library (like AJV for JavaScript/TypeScript, or others for Python, Java, etc.) to test your schemas with both valid and invalid data. This iterative testing helps catch errors and refine your schema definitions.
Consider Versioning Your Schemas
For evolving APIs or data formats, consider a versioning strategy for your schemas (e.g., /v1/
, /v2/
in your $id
URIs). This allows for backward compatibility while introducing breaking changes in new versions.
Challenges and Considerations
While powerful, JSON Schema comes with its own set of challenges: Free online vector drawing software
Complexity for Deeply Nested Structures
Very complex or deeply nested schemas can become difficult to read and maintain. Proper modularization with $defs
and clear naming conventions are essential.
Performance Implications
For extremely large JSON data instances or highly complex schemas, validation can have performance implications. Choosing an efficient validation library (like AJV, which is known for its speed, processing millions of validations per second depending on schema complexity) and optimizing schema structure can mitigate this.
Tooling Support
While tooling for JSON Schema is maturing, not all environments or languages have equally robust support. Always verify that your chosen tools and libraries fully support Draft 2020-12, especially for newer keywords like $vocabulary
, $dynamicRef
, and unevaluatedProperties
.
Understanding Error Messages
Sometimes, validation error messages, especially from complex oneOf
/anyOf
failures or unevaluatedProperties
, can be cryptic. Investing time in understanding how your chosen validator reports errors is key to efficient debugging. Tools that provide clear pathing and schema keyword context are highly beneficial.
Schema Evolution
Planning for schema evolution is critical. Using additionalProperties: false
or unevaluatedProperties: false
creates “closed” schemas that are strict but can make backward-compatible changes harder. If you anticipate adding new properties in the future, you might need to reconsider such strictness or use unevaluatedProperties
with a schema that allows new properties, e.g., "unevaluatedProperties": { "type": "string" }
to ensure new properties are strings.
Conclusion
JSON Schema Draft 2020-12 provides a robust, expressive, and standardized language for defining and validating JSON data. Its enhancements, particularly around applicator keywords, schema identification, and the introduction of unevaluatedProperties
/items
, empower developers to create more precise, maintainable, and future-proof data contracts. By adopting these features and following best practices, you can significantly improve data quality, streamline development workflows, and build more resilient systems. Regularly using an json schema validator online 2020 12
tool is an excellent habit to ensure your schemas and data remain in sync.
FAQ
What is a JSON Schema validator online 2020-12?
A JSON Schema validator online 2020-12 is a web-based tool that allows users to paste a JSON Schema definition (conforming to the 2020-12 draft specification) and a JSON data instance, then validate the data against the schema. It provides immediate feedback, indicating whether the data is valid or detailing any validation errors.
Why is it important to use Draft 2020-12 specifically?
Using Draft 2020-12 is important because it is the latest stable release of the JSON Schema specification. It includes improvements, clarifications, and new keywords like $vocabulary
, unevaluatedProperties
, prefixItems
(replacing items
for tuple validation), and refined if
/then
/else
behavior. Using the latest draft ensures you leverage the most current and robust features for data validation.
How do I specify Draft 2020-12 in my JSON Schema?
To specify Draft 2020-12 in your JSON Schema, you must include the $schema
keyword at the root of your schema with the URI: "https://json-schema.org/draft/2020-12/schema"
. For example: {"$schema": "https://json-schema.org/draft/2020-12/schema", ...}
.
Can I validate against older JSON Schema drafts using a 2020-12 validator?
Generally, a 2020-12 validator is designed to enforce the rules and keywords of the 2020-12 draft. While it might successfully validate simple schemas from older drafts that don’t use deprecated or changed keywords, it’s always best practice to use a validator that explicitly supports the draft version your schema was written for to avoid unexpected behavior or errors due to keyword changes.
What is the purpose of the $vocabulary
keyword in Draft 2020-12?
The $vocabulary
keyword in Draft 2020-12 allows a schema to explicitly declare which vocabularies (sets of keywords) it uses. This enhances modularity, enables better tooling support, and clarifies the intended scope of the schema, making it more robust against future standard updates.
What are unevaluatedProperties
and unevaluatedItems
and why are they important?
unevaluatedProperties
and unevaluatedItems
are new keywords in Draft 2020-12 that provide a powerful way to create “closed” schemas. They apply validation rules to properties or array items that have not been evaluated by other keywords. Setting them to false
is crucial for ensuring that no extraneous data is present in your JSON, which is vital for strict data contracts and preventing unexpected fields.
What is the json-schema-validator example
demonstrating?
A json-schema-validator example
typically demonstrates how a specific JSON Schema definition (e.g., for a “Product” or “User” object) is used to validate a corresponding JSON data instance. It showcases various schema keywords like type
, properties
, required
, minimum
, pattern
, and items
and how they apply to the data, highlighting both valid and invalid data examples.
How does oneOf
differ from anyOf
in JSON Schema validation?
oneOf
requires the JSON instance to be valid against exactly one of the subschemas provided. anyOf
requires the JSON instance to be valid against at least one of the subschemas provided (it can be one or more). oneOf
enforces mutual exclusivity, while anyOf
allows for multiple valid options.
When should I use if
/then
/else
instead of oneOf
for conditional validation?
Use if
/then
/else
when you want to apply different validation rules to a part of your schema conditionally, based on the presence or value of another property in the instance. It’s often more readable and explicit for defining dependent rules. Use oneOf
when your instance must conform to one specific, mutually exclusive type or structure from a set of options.
What replaced the definitions
keyword in Draft 2020-12?
In Draft 2020-12, the definitions
keyword has been renamed to $defs
. It serves the same purpose: providing a location within the schema to define reusable subschemas that can be referenced using $ref
. This change aligns it with other structural keywords like $id
and $ref
.
How can I make my JSON Schema recursive in Draft 2020-12?
Recursive schemas in Draft 2020-12 are best handled using the new $dynamicRef
and $dynamicAnchor
keywords. $dynamicAnchor
marks a point in the schema, and $dynamicRef
allows dynamic resolution of that anchor, enabling true recursion, unlike the static resolution of $ref
.
What is the purpose of the format
keyword in JSON Schema?
The format
keyword (e.g., email
, date-time
, uri
) is used to provide semantic validation for string values beyond just their type or pattern. While regular expressions (pattern
) check syntax, format
suggests a commonly understood meaning and typically implies additional validation rules (e.g., an email address must be a syntactically valid email). Validators may implement format
validation.
Can JSON Schema validate data types like Date
or Time
?
JSON Schema does not have native Date
or Time
data types. Instead, it validates them as string
types and uses the format
keyword (e.g., date
, time
, date-time
) to indicate the expected string format conforming to standards like ISO 8601.
What does additionalProperties: false
do?
When additionalProperties: false
is used within an object schema, it specifies that no properties other than those explicitly listed in properties
or matched by patternProperties
are allowed in the JSON instance. This keyword is often used to create “closed” object schemas.
How do prefixItems
and items
work together in Draft 2020-12 for arrays?
In Draft 2020-12, prefixItems
(an array of schemas) validates items at specific positions in an array (tuple validation). items
(a single schema) then applies to all additional items in the array after those defined by prefixItems
. If items
is absent, no additional items are allowed beyond what prefixItems
specifies.
What are $id
and $ref
used for?
$id
defines a unique URI for a schema, establishing its base identifier and context for relative references. $ref
is used to reference another schema or a part of another schema (identified by its $id
or a JSON Pointer), enabling schema reusability and modularity.
What is dependentRequired
?
dependentRequired
is an object keyword where, if a specified property (the key) is present in the JSON instance, then a list of other properties (the value) must also be present. It’s a way to define conditional mandatory fields.
Can I include comments in my JSON Schema?
While JSON itself does not officially support comments, some JSON Schema authoring tools or validator implementations might strip them or provide workarounds. For documentation within the schema, it’s best to use the title
and description
keywords, which are standard and formally part of the schema definition.
How do I get detailed error messages from an online JSON Schema validator?
Most good online JSON Schema validators will provide detailed error messages in their “Validation Results” section. These messages typically include:
- The
path
to the invalid part of the JSON data. - The
keyword
that failed validation (e.g.,type
,required
,oneOf
). - A
message
explaining the error. - Sometimes, specific
params
related to the validation failure.
Is JSON Schema suitable for all data validation needs?
JSON Schema is excellent for structural and content validation of JSON data. However, for complex business logic validation (e.g., checking if an order total matches the sum of its line items after discounts, which requires computation), you’ll typically need to implement custom application-level code after initial JSON Schema validation. It defines the shape and basic constraints of your data.
Leave a Reply