NAME

JSON::Schema::Shorthand - Alternative, condensed format for JSON Schemas

VERSION

version 0.0.2

SYNOPSIS

use JSON::Schema::Shorthand;

my $schema = js_shorthand({
    object => { foo => 'number', bar => { type => 'string', required => 1 }         
});

# $schema is 
# { 
#   type => 'object',
#   properties => {
#       foo => { type => 'number' },
#       bar => { type => string },
#  }
#  required => [ 'bar' ],
# }

DESCRIPTION

JSON Schema is a useful beast, but its schema definition can be a little bit more long-winded than necessary. This module allows to use a few shortcuts that will be expanded into their canonical form.

CAVEAT: the module is still very young, and there are plenty of properties this module should expand and does not. So don't trust it blindly. If you hit such a case, raise a ticket and I'll refine the process.

js_shorthand

my $schema = js_shorthand $shorthand;

The module exports a single function, js_shorthand, that takes in a JSON schema in shorthand notation and returns the expanded, canonical schema form.

If you don't like the name js_shorthand, you can always import it under a different name in your namespace.

use JSON::Schema::Shorthand 'js_shorthand' => { -as => 'expand_json_schema' };

...;

my $schema = expand_json_schema $shorthand;

Types as string

If a string type is encountered where a property definition is expected, the string is expanded to the object { "type": type }.

{
    "foo": "number",
    "bar": "string"
}

expands to

{
    "foo": { "type": "number" },
    "bar": { "type": "string" }
}

If the string begins with a #, the type is assumed to be a reference and #type is expanded to { "$ref": type }.

{ "foo": "#/definitions/bar" } 

becomes

{ "foo": { "$ref": "#/definitions/bar" } }

object property

{ object: properties } expands to { type: "object", properties }.

shorthand                              expanded
------------------------               ---------------------------
foo: {                                  foo: {
    object: {                               type: "object",
        bar: { }                            properties: {
    }                                           bar: { }
}                                           }
                                        }

array property

{ array: items } expands to { type: "array", items }.

shorthand                              expanded
------------------------               ---------------------------
foo: {                                  foo: {
    array: 'number'                         type: "array",
}                                           items: {
                                                type: 'number' 
                                            }
                                        }

required property

If the required attribute is set to true for a property, it is bubbled up to the required attribute of its parent object.

shorthand                              expanded
------------------------               ---------------------------

foo: {                                  foo: {
    properties: {                           required: [ 'bar' ],
      bar: { required: true },              properties: { 
      baz: { }                                bar: {},
    }                                         baz: {}
}                                       }

SEE ALSO

* JSON Schema specs - http://json-schema.org/

* JavaScript version of this module - http://github.com/yanick/json-shema-shorthand

AUTHOR

Yanick Champoux <yanick@babyl.dyndns.org>

COPYRIGHT AND LICENSE

This software is copyright (c) 2016 by Yanick Champoux.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.

1 POD Error

The following errors were encountered while parsing the POD:

Around line 136:

Unknown directive: =head2Shorthands