The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

JSON::Schema::Examples - examples of JSON::Schema

EXAMPLES

Validate some JSON contact info against nested schemas.

The card schema at http://json-schema.org/card is tricky as it contains references to other schemas which need to be followed. But JSON::Schema handles it with ease...

use JSON qw[to_json];
use JSON::Schema;
use LWP::Simple qw[get];

# Here's some data...
my $contact = to_json({
  fn        => 'Toby Inkster',
  nickname  => 'TOBYINK',
  email     => { value => 'tobyink@cpan.org' },
  adr       => { countryName => 'England', region => 'East Sussex' },
});

# Now we create our JSON Schema validator:
my $card_schema = get('http://json-schema.org/card'); 
my $validator = JSON::Schema->new($card_schema);

# Validate:
my $valid = $validator->validate($contact);
if ($valid)
{
  print "Yay!\n";
  exit;
}

# But it's not valid...
foreach my $e ($valid->errors)
{
  print "Naughty! $e\n";
}

Validate a native Perl structure.

JSON::Schema has uses beyond JSON!

use JSON:Schema;
use DateTime;

my $datetime_new_schema = {
  type => 'object', # i.e. a hashref
  properties => {
    year       => { type=>'number', minimum=>0, maximum=>9999 },
    month      => { type=>'number', minimum=>1, maximum=>12 },
    day        => { type=>'number', minimum=>1, maximum=>31 },
    hour       => { type=>'number', minimum=>0, maximum=>23 },
    minute     => { type=>'number', minimum=>0, maximum=>59 },
    second     => { type=>'number', minimum=>0, maximum=>61 },
    nanosecond => { type=>'number', minimum=>0, maximum=>999999999 },
    locale     => { type=>['DateTime::Locale','string'] },
    time_zone  => { type=>['DateTime::TimeZone', 'string'] },
    formatter  => { type=>'any' },
  }
};
my $validator = JSON::Schema->new($datetime_new_schema);

my %params = get_user_input();
my $valid  = $validator->validate(\%params);
if ($valid)
{
  my $dt = DateTime->new(%params);
  
  # do something interesting here with $dt...
}
else
{
  die join("\n", "Invalid DateTime paramaters", $valid->errors);
}

AUTHOR

Toby Inkster <tobyink@cpan.org>.

COPYRIGHT AND LICENCE

Copyright 2010-2012 Toby Inkster.

GNU Free Documentation Licence, Version 1.3

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.

http://www.gnu.org/copyleft/fdl.html.

Creative Commons Attribution-ShareAlike 2.0 UK: England & Wales

This work is licenced under the Creative Commons Attribution-ShareAlike 2.0 UK: England & Wales License. To view a copy of this licence, visit http://creativecommons.org/licenses/by-sa/2.0/uk/ or send a letter to Creative Commons, 171 Second Street, Suite 300, San Francisco, California 94105, USA.