
Security News
Astral Launches pyx: A Python-Native Package Registry
Astral unveils pyx, a Python-native package registry in beta, designed to speed installs, enhance security, and integrate deeply with uv.
h1. Ruby JSON Schema Validator
This library is intended to provide Ruby with an interface for validating JSON objects against a JSON schema conforming to "JSON Schema Draft 3":http://tools.ietf.org/html/draft-zyp-json-schema-03. Legacy support for "JSON Schema Draft 2":http://tools.ietf.org/html/draft-zyp-json-schema-02 and "JSON Schema Draft 1":http://tools.ietf.org/html/draft-zyp-json-schema-01 is also included.
h2. Dependencies
The JSON::Schema library has no dependencies if the validation methods are called using Ruby objects. However, either the json
or the yajl-ruby
gem needs to be installed to validate JSON strings or files containing JSON data.
h2. Installation
From rubygems.org:
gem install json-schema
From the git repo:
$ gem build json-schema.gemspec $ gem install json-schema-1.0.1.gem
h2. Usage
Three base validation methods exist: validate
, validate!
, and fully_validate
. The first returns a boolean on whether a validation attempt passes and the second will throw a JSON::Schema::ValidationError
with an appropriate message/trace on where the validation failed. The third validation method does not immediately fail upon a validation error and instead builds an array of validation errors return when validation is complete.
All methods take two arguments, which can be either a JSON string, a file containing JSON, or a Ruby object representing JSON data. The first argument to these methods is always the schema, the second is always the data to validate. An optional third options argument is also accepted; available options are used in the examples below.
By default, the validator uses the "JSON Schema Draft 3":http://tools.ietf.org/html/draft-zyp-json-schema-03 specification for validation; however, the user is free to specify additional specifications or extend existing ones. Legacy support for Draft 1 and Draft 2 is included by either passing an optional :version
parameter to the validate
method (set either as :draft1
or draft2
), or by declaring the $schema
attribute in the schema and referencing the appropriate specification URI. Note that the $schema
attribute takes precedence over the :version
option during parsing and validation.
h3. Validate Ruby objects against a Ruby schema
require 'rubygems' require 'json-schema' schema = { "type" => "object", "properties" => { "a" => {"type" => "integer", "required" => true} } } data = { "a" => 5 } JSON::Validator.validate(schema, data)
h3. Validate a JSON string against a JSON schema file
require 'rubygems' require 'json-schema' JSON::Validator.validate('schema.json', '{"a" : 5}')
h3. Validate a list of objects against a schema that represents the individual objects
require 'rubygems' require 'json-schema' data = ['user','user','user'] JSON::Validator.validate('user.json', data, :list => true)
h3. Catch a validation error and print it out
require 'rubygems' require 'json-schema' schema = { "type" => "object", "properties" => { "a" => {"type" => "integer", "required" => true} } } data = { "a" => "taco" } begin JSON::Validator.validate!(schema, data) rescue JSON::Schema::ValidationError puts $!.message end
h3. Validate a JSON object against a JSON schema object, while also validating the schema itself
require 'rubygems' require 'json-schema' schema = { "type" => "object", "properties" => { "a" => {"type" => "integer", "required" => "true"} # This will fail schema validation! } } data = { "a" => 5 } JSON::Validator.validate(schema, data, :validate_schema => true)
h3. Validate an object against a JSON Schema Draft 2 schema
require 'rubygems' require 'json-schema' schema = { "type" => "object", "properties" => { "a" => {"type" => "integer", "optional" => true} } } data = { "a" => 5 } JSON::Validator.validate(schema, data, :version => :draft2)
h3. Extend an existing schema and validate against it
For this example, we are going to extend the "JSON Schema Draft 3":http://tools.ietf.org/html/draft-zyp-json-schema-03 specification by adding a 'bitwise-and' property for validation.
require 'rubygems' require 'json-schema' class BitwiseAndAttribute < JSON::Schema::Attribute def self.validate(current_schema, data, fragments, validator, options = {}) if data.is_a?(Integer) && data & current_schema.schema['bitwise-and'].to_i == 0 message = "The property '#{build_fragment(fragments)}' did not evaluate to true when bitwise-AND'd with #{current_schema.schema['bitwise-or']}" raise JSON::Schema::ValidationError.new(message, fragments, current_schema) end end end class ExtendedSchema < JSON::Schema::Validator def initialize super extend_schema_definition("http://json-schema.org/draft-03/schema#") @attributes["bitwise-and"] = BitwiseAndAttribute @uri = URI.parse("http://test.com/test.json") end JSON::Validator.register_validator(self.new) end schema = { "$schema" => "http://test.com/test.json", "properties" => { "a" => { "bitwise-and" => 1 }, "b" => { "type" => "string" } } } data = { "a" => 0 } data = {"a" => 1, "b" => "taco"} JSON::Validator.validate(schema,data) # => true data = {"a" => 1, "b" => 5} JSON::Validator.validate(schema,data) # => false data = {"a" => 0, "b" => "taco"} JSON::Validator.validate(schema,data) # => false
h2. JSON Backends
The JSON::Schema library currently supports the json
and yajl-ruby
backend JSON parsers. If either of these libraries are installed, they will be automatically loaded and used to parse any JSON strings supplied by the user.
If more than one of the supported JSON backends are installed, the yajl-ruby
parser is used by default. This can be changed by issuing the following before validation:
JSON::Validator.json_backend = :json
h2. Notes
The following core schema attributes are not implemented:
The 'format' attribute is only validated for the following values:
All other 'format' attribute values are simply checked to ensure the instance value is of the correct datatype (e.g., an instance value is validated to be an integer or a float in the case of 'utc-millisec').
Additionally, JSON::Validator does not handle any json hyperschema attributes.
FAQs
Unknown package
We found that seomoz-json-schema demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Astral unveils pyx, a Python-native package registry in beta, designed to speed installs, enhance security, and integrate deeply with uv.
Security News
The Latio podcast explores how static and runtime reachability help teams prioritize exploitable vulnerabilities and streamline AppSec workflows.
Security News
The latest Opengrep releases add Apex scanning, precision rule tuning, and performance gains for open source static code analysis.