NAME
Data::JSONSchema::Ajv - JSON Schema Validator wrapping Ajv
VERSION
version 0.02
DESCRIPTION
JSON Schema Validator wrapping Ajv
SYNOPSIS
use Test::More;
use Data::JSONSchema::Ajv;
my $ajv_options = {};
my $my_options = { convert_boolean => 1 };
my $ajv = Data::JSONSchema::Ajv->new($ajv_options, $my_options);
my $validator = $ajv->make_validator(
{ # http://json-schema.org/examples.html
title => "Example Schema",
type => "object",
properties => {
firstName => { type => "string" },
lastName => { type => "string" },
age => {
description => "Age in years",
type => "integer",
minimum => 0
}
},
required => [ "firstName", "lastName" ],
}
);
my $payload = { firstName => 'Valentina', familyName => 'Tereshkova' };
my $result = $validator->validate($payload);
if ($result) {
is_deeply(
$result,
[ { dataPath => "",
keyword => "required",
message => "should have required property 'lastName'",
params => { missingProperty => "lastName" },
schemaPath => "#/required"
}
],
"Expected errors thrown"
);
} else {
fail(
"validate() returned a false value, which means the example " .
"unexpectedly validated"
);
}
WHAT WHY
This module is an offensively light-weight wrapper Ajv.
Light-weight may be a misleading statement. It relies on JavaScript::Duktape which in turn relies on Inline::C. The very first time you run this, expect an instantiation time of ~20 seconds. After that, it's fast.
Light-weight in this context just means it's only 50 lines or so of actual Perl.
METHODS
new
my $ajv = Data::JSONSchema::Ajv->new(
{ v5 => JavaScript::Duktape::Bool->true },
{ convert_boolean => 1 },
);
Instantiates a new JavaScript::Duktape environment and loads Ajv
into it. Accepts two hashrefs (or undefs). The first is passed straight through to Ajv
, whose options are documented here.
The second is options for this module. Currently only convert_boolean
is allowed (default: false), and specifies whether incoming data-structures should have various Perl JSON's modules boolean values converted to JavaScript::Duktape's boolean values. See BOOLEANS below.
make_validator
my $validator = $ajv->make_validator( $hashref_schema );
Compiles your schema using Ajv
and return a Data::JSONSchema::Ajv::Validator
object, documented immediately below.
Data::JSONSchema::Ajv::Validator
Single method object:
validate
my $errors = $validator->validate( $data_structure );
Validate a data-structure against the schema. Returns undef
on success, and a data-structure complaining on failure. The data-structure is whatever Ajv
produces - you can either read its documentation, or be lazy and simply Data::Dumper it.
BOOLEANS
Perl has no special Boolean types. JSON (and indeed JavaScript) does. On load, this module creates a package singleton called $visitor
which recognizes and converts common workarounds for this in to JavaScript::Duktape::Bool.
Currently that's a small list consisting of Types::Serialiser::BooleanBase's and JSON::Boolean's Boolean values, but you can easily overwrite the $visitor
object and send me a patch for your favourite type.
If you've set convert_boolean
to true, then calls to make_validator
and validate
will run their input through the visitor object, and convert their Booleans. This means you can push data in that you've read with, say, JSON::XS without having to think about it.
Also: undef
--> JavaScript::Duktape::NULL.
SEE ALSO
This module was written because I couldn't get any of the other JSON Schema validators to work.
Toby Inkster wrote JSON::Schema, which I had high hopes for, because he's a smart cookie, but it seems like it's very out of date compared to modern schemas.
I was unable to get JSON::Validator to fail validation for any schema I gave it. That's probably due to having miswritten my schemas, but it didn't give me any hints, and I did get some errors along the lines of Can't locate method validate_HASH(blahblah) and so I gave up. I also find it mildly offensive that (the most excellent) Mojolicious is a dependency for a JSON tool. Additionally it doesn't validate the schemas themselves, and I'm too stupid to use a tool like that.
Test::JSON::Schema::Acceptance provides some schema tests. This passes all of thems except the ones that require going and downloading external schemas.
AUTHOR
All the hard work was done by the guy who wrote Ajv, Evgeny Poberezkin.
This Perl wrapper written by Peter Sergeant.