NAME
JSON::Schema::Generate - Generate JSON Schemas from data!
VERSION
Version 0.10
SYNOPSIS
use JSON::Schema::Generate;
my $data = '{
"checked": false,
"dimensions": {
"width": 10,
"height": 10
},
"id": 1,
"name": "Opposite",
"distance": 435,
"tags": [
{ "date-time": "2020-02-24T10:00:00+00:00" }
]
}';
my $schema = JSON::Schema::Generate->new(
id => 'https://flat.world-wide.world/schema',
title => '...'
description => '...',
spec => {
name => {
title => '...',
description => '...'
},
...
}
)->learn($data)->generate;
use JSON::Schema;
my $validator = JSON::Schema->new($schema);
my $result = $validator->validate($data);
...
my $schema = JSON::Schema::Generate->new(
no_id => 1
)->learn($data)->generate(1);
use JSON::Schema::Draft201909;
$js = JSON::Schema::Draft201909->new;
$result = $js->evaluate_json_string($data, $schema);
DESCRIPTION
JSON::Schema::Generate is a tool allowing you to derive JSON Schemas from a set of data.
SUBROUTINES/METHODS
new
Instantiate a new JSON::Schema::Generate Object
my $schema = JSON::Schema->new(
...
);
It accepts the following parameters:
- id
-
The root $id of the schema. default: http://example.com/root.json
- title
-
The root title of the schema. default: The Root Schema
- description
-
The root description of the schema. default: The root schema is the schema that comprises the entire JSON document.
- schema
-
The root schema version. default: 'http://json-schema.org/draft-07/schema#'
- spec
-
A mapping hash reference that represent a key inside of the passed data and a value that contains additional metadata to be added to the schema. default: {}
- merge_examples
-
Merge all learn data examples into a single example. default: false
- none_required
-
Do not analyse required keys in properties. default: false.
- no_id
-
Do not add $id(s) to properties and items. default: false.
learn
Accepts a JSON string, Hashref or ArrayRef that it will traverse to build a valid JSON schema. Learn can be chained allowing you to build a schema from multiple data sources.
$schema->learn($data1)->learn($data2)->learn($data3);
generate
Compiles the learned data and generates the final JSON schema in JSON format.
$schema->generate();
Optionally you can pass a boolean (true value) which will return the schema as a perl struct.
$schema->generate(1)
EXAMPLE
use JSON::Schema::Generate;
my $data1 = '{
"links" : {
"cpantesters_reports" : "http://cpantesters.org/author/L/LNATION.html",
"cpan_directory" : "http://cpan.org/authors/id/L/LN/LNATION",
"metacpan_explorer" : "https://explorer.metacpan.org/?url=/author/LNATION",
"cpantesters_matrix" : "http://matrix.cpantesters.org/?author=LNATION",
"cpants" : "http://cpants.cpanauthors.org/author/LNATION",
"backpan_directory" : "https://cpan.metacpan.org/authors/id/L/LN/LNATION"
},
"city" : "PLUTO",
"updated" : "2020-02-16T16:43:51",
"region" : "GHANDI",
"is_pause_custodial_account" : false,
"country" : "WO",
"website" : [
"https://www.lnation.org"
],
"asciiname" : "Robert Acock",
"gravatar_url" : "https://secure.gravatar.com/avatar/8e509558181e1d2a0d3a5b55dec0b108?s=130&d=identicon",
"pauseid" : "LNATION",
"email" : [
"lnation@cpan.org"
],
"release_count" : {
"cpan" : 378,
"backpan-only" : 34,
"latest" : 114
},
"name" : "Robert Acock"
}';
my $data2 = '{
"asciiname" : "",
"release_count" : {
"latest" : 56,
"backpan-only" : 358,
"cpan" : 190
},
"name" : "Damian Conway",
"email" : "damian@conway.org",
"is_pause_custodial_account" : false,
"gravatar_url" : "https://secure.gravatar.com/avatar/3d4a6a089964a744d7b3cf2415f81951?s=130&d=identicon",
"links" : {
"cpants" : "http://cpants.cpanauthors.org/author/DCONWAY",
"cpan_directory" : "http://cpan.org/authors/id/D/DC/DCONWAY",
"cpantesters_matrix" : "http://matrix.cpantesters.org/?author=DCONWAY",
"cpantesters_reports" : "http://cpantesters.org/author/D/DCONWAY.html",
"backpan_directory" : "https://cpan.metacpan.org/authors/id/D/DC/DCONWAY",
"metacpan_explorer" : "https://explorer.metacpan.org/?url=/author/DCONWAY"
},
"pauseid" : "DCONWAY",
"website" : [
"http://damian.conway.org/"
]
}';
my $schema = JSON::Schema::Generate->new(
id => 'https://metacpan.org/author.json',
title => 'The CPAN Author Schema',
description => 'A representation of a cpan author.',
)->learn($data1)->learn($data2)->generate;
Will generate the following schema:
{
"$schema" : "http://json-schema.org/draft-07/schema#",
"$id" : "https://metacpan.org/author.json",
"title" : "The CPAN Author Schema",
"description" : "A representation of a cpan author.",
"type" : "object",
"examples" : [
{
"region" : "GHANDI",
"gravatar_url" : "https://secure.gravatar.com/avatar/8e509558181e1d2a0d3a5b55dec0b108?s=130&d=identicon",
"is_pause_custodial_account" : false,
"asciiname" : "Robert Acock",
"release_count" : {
"backpan-only" : 34,
"latest" : 114,
"cpan" : 378
},
"country" : "WO",
"city" : "PLUTO",
"pauseid" : "LNATION",
"links" : {
"cpants" : "http://cpants.cpanauthors.org/author/LNATION",
"metacpan_explorer" : "https://explorer.metacpan.org/?url=/author/LNATION",
"cpantesters_reports" : "http://cpantesters.org/author/L/LNATION.html",
"cpan_directory" : "http://cpan.org/authors/id/L/LN/LNATION",
"cpantesters_matrix" : "http://matrix.cpantesters.org/?author=LNATION",
"backpan_directory" : "https://cpan.metacpan.org/authors/id/L/LN/LNATION"
},
"updated" : "2020-02-16T16:43:51",
"website" : [
"https://www.lnation.org"
],
"name" : "Robert Acock",
"email" : [
"lnation@cpan.org"
]
},
{
"is_pause_custodial_account" : false,
"gravatar_url" : "https://secure.gravatar.com/avatar/3d4a6a089964a744d7b3cf2415f81951?s=130&d=identicon",
"asciiname" : "",
"release_count" : {
"backpan-only" : 358,
"latest" : 56,
"cpan" : 190
},
"links" : {
"cpan_directory" : "http://cpan.org/authors/id/D/DC/DCONWAY",
"cpantesters_reports" : "http://cpantesters.org/author/D/DCONWAY.html",
"cpants" : "http://cpants.cpanauthors.org/author/DCONWAY",
"metacpan_explorer" : "https://explorer.metacpan.org/?url=/author/DCONWAY",
"backpan_directory" : "https://cpan.metacpan.org/authors/id/D/DC/DCONWAY",
"cpantesters_matrix" : "http://matrix.cpantesters.org/?author=DCONWAY"
},
"pauseid" : "DCONWAY",
"website" : [
"http://damian.conway.org/"
],
"email" : "damian@conway.org",
"name" : "Damian Conway"
}
],
"required" : [
"asciiname",
"gravatar_url",
"is_pause_custodial_account",
"release_count",
"pauseid",
"links",
"name",
"email",
"website"
],
"properties" : {
"asciiname" : {
"$id" : "#/properties/asciiname",
"title" : "The Asciiname Schema",
"description" : "An explanation about the purpose of this instance.",
"type" : "string",
"examples" : [
"Robert Acock",
""
]
},
"city" : {
"$id" : "#/properties/city",
"title" : "The City Schema",
"description" : "An explanation about the purpose of this instance.",
"type" : "string",
"examples" : [
"PLUTO"
]
},
"country" : {
"$id" : "#/properties/country",
"title" : "The Country Schema",
"description" : "An explanation about the purpose of this instance.",
"type" : "string",
"examples" : [
"WO"
]
},
"email" : {
"$id" : "#/properties/email",
"title" : "The Email Schema",
"description" : "An explanation about the purpose of this instance.",
"type" : [
"array",
"string"
],
"items" : {
"$id" : "#/properties/email/items",
"title" : "The Items Schema",
"description" : "An explanation about the purpose of this instance.",
"type" : "string",
"examples" : [
"lnation@cpan.org"
]
},
"examples" : [
"damian@conway.org"
]
},
"gravatar_url" : {
"$id" : "#/properties/gravatar_url",
"title" : "The Gravatar_url Schema",
"description" : "An explanation about the purpose of this instance.",
"type" : "string",
"examples" : [
"https://secure.gravatar.com/avatar/8e509558181e1d2a0d3a5b55dec0b108?s=130&d=identicon",
"https://secure.gravatar.com/avatar/3d4a6a089964a744d7b3cf2415f81951?s=130&d=identicon"
]
},
"is_pause_custodial_account" : {
"$id" : "#/properties/is_pause_custodial_account",
"title" : "The Is_pause_custodial_account Schema",
"description" : "An explanation about the purpose of this instance.",
"type" : "boolean",
"examples" : [
true,
false
]
},
"links" : {
"$id" : "#/properties/links",
"title" : "The Links Schema",
"description" : "An explanation about the purpose of this instance.",
"type" : "object",
"examples" : [
{
"cpants" : "http://cpants.cpanauthors.org/author/LNATION",
"metacpan_explorer" : "https://explorer.metacpan.org/?url=/author/LNATION",
"cpantesters_reports" : "http://cpantesters.org/author/L/LNATION.html",
"cpan_directory" : "http://cpan.org/authors/id/L/LN/LNATION",
"cpantesters_matrix" : "http://matrix.cpantesters.org/?author=LNATION",
"backpan_directory" : "https://cpan.metacpan.org/authors/id/L/LN/LNATION"
},
{
"cpan_directory" : "http://cpan.org/authors/id/D/DC/DCONWAY",
"cpantesters_reports" : "http://cpantesters.org/author/D/DCONWAY.html",
"cpants" : "http://cpants.cpanauthors.org/author/DCONWAY",
"metacpan_explorer" : "https://explorer.metacpan.org/?url=/author/DCONWAY",
"backpan_directory" : "https://cpan.metacpan.org/authors/id/D/DC/DCONWAY",
"cpantesters_matrix" : "http://matrix.cpantesters.org/?author=DCONWAY"
}
],
"required" : [
"cpantesters_matrix",
"backpan_directory",
"metacpan_explorer",
"cpants",
"cpantesters_reports",
"cpan_directory"
],
"properties" : {
"backpan_directory" : {
"$id" : "#/properties/links/properties/backpan_directory",
"title" : "The Backpan_directory Schema",
"description" : "An explanation about the purpose of this instance.",
"type" : "string",
"examples" : [
"https://cpan.metacpan.org/authors/id/L/LN/LNATION",
"https://cpan.metacpan.org/authors/id/D/DC/DCONWAY"
]
},
"cpan_directory" : {
"$id" : "#/properties/links/properties/cpan_directory",
"title" : "The Cpan_directory Schema",
"description" : "An explanation about the purpose of this instance.",
"type" : "string",
"examples" : [
"http://cpan.org/authors/id/L/LN/LNATION",
"http://cpan.org/authors/id/D/DC/DCONWAY"
]
},
"cpantesters_matrix" : {
"$id" : "#/properties/links/properties/cpantesters_matrix",
"title" : "The Cpantesters_matrix Schema",
"description" : "An explanation about the purpose of this instance.",
"type" : "string",
"examples" : [
"http://matrix.cpantesters.org/?author=LNATION",
"http://matrix.cpantesters.org/?author=DCONWAY"
]
},
"cpantesters_reports" : {
"$id" : "#/properties/links/properties/cpantesters_reports",
"title" : "The Cpantesters_reports Schema",
"description" : "An explanation about the purpose of this instance.",
"type" : "string",
"examples" : [
"http://cpantesters.org/author/L/LNATION.html",
"http://cpantesters.org/author/D/DCONWAY.html"
]
},
"cpants" : {
"$id" : "#/properties/links/properties/cpants",
"title" : "The Cpants Schema",
"description" : "An explanation about the purpose of this instance.",
"type" : "string",
"examples" : [
"http://cpants.cpanauthors.org/author/LNATION",
"http://cpants.cpanauthors.org/author/DCONWAY"
]
},
"metacpan_explorer" : {
"$id" : "#/properties/links/properties/metacpan_explorer",
"title" : "The Metacpan_explorer Schema",
"description" : "An explanation about the purpose of this instance.",
"type" : "string",
"examples" : [
"https://explorer.metacpan.org/?url=/author/LNATION",
"https://explorer.metacpan.org/?url=/author/DCONWAY"
]
}
}
},
"name" : {
"$id" : "#/properties/name",
"title" : "The Name Schema",
"description" : "An explanation about the purpose of this instance.",
"type" : "string",
"examples" : [
"Robert Acock",
"Damian Conway"
]
},
"pauseid" : {
"$id" : "#/properties/pauseid",
"title" : "The Pauseid Schema",
"description" : "An explanation about the purpose of this instance.",
"type" : "string",
"examples" : [
"LNATION",
"DCONWAY"
]
},
"region" : {
"$id" : "#/properties/region",
"title" : "The Region Schema",
"description" : "An explanation about the purpose of this instance.",
"type" : "string",
"examples" : [
"GHANDI"
]
},
"release_count" : {
"$id" : "#/properties/release_count",
"title" : "The Release_count Schema",
"description" : "An explanation about the purpose of this instance.",
"type" : "object",
"examples" : [
{
"backpan-only" : 34,
"latest" : 114,
"cpan" : 378
},
{
"backpan-only" : 358,
"latest" : 56,
"cpan" : 190
}
],
"required" : [
"latest",
"backpan-only",
"cpan"
],
"properties" : {
"backpan-only" : {
"$id" : "#/properties/release_count/properties/backpan-only",
"title" : "The Backpan-only Schema",
"description" : "An explanation about the purpose of this instance.",
"type" : "integer",
"examples" : [
34,
358
]
},
"cpan" : {
"$id" : "#/properties/release_count/properties/cpan",
"title" : "The Cpan Schema",
"description" : "An explanation about the purpose of this instance.",
"type" : "integer",
"examples" : [
378,
190
]
},
"latest" : {
"$id" : "#/properties/release_count/properties/latest",
"title" : "The Latest Schema",
"description" : "An explanation about the purpose of this instance.",
"type" : "integer",
"examples" : [
114,
56
]
}
}
},
"updated" : {
"$id" : "#/properties/updated",
"title" : "The Updated Schema",
"description" : "An explanation about the purpose of this instance.",
"type" : "string",
"examples" : [
"2020-02-16T16:43:51"
]
},
"website" : {
"$id" : "#/properties/website",
"title" : "The Website Schema",
"description" : "An explanation about the purpose of this instance.",
"type" : "array",
"items" : {
"$id" : "#/properties/website/items",
"title" : "The Items Schema",
"description" : "An explanation about the purpose of this instance.",
"type" : "string",
"examples" : [
"https://www.lnation.org",
"http://damian.conway.org/"
]
}
}
}
}
AUTHOR
LNATION, <email at lnation.org>
BUGS
Please report any bugs or feature requests to bug-json-schema-generate at rt.cpan.org
, or through the web interface at https://rt.cpan.org/NoAuth/ReportBug.html?Queue=JSON-Schema-Generate. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.
SUPPORT
You can find documentation for this module with the perldoc command.
perldoc JSON::Schema::Generate
You can also look for information at:
RT: CPAN's request tracker (report bugs here)
https://rt.cpan.org/NoAuth/Bugs.html?Dist=JSON-Schema-Generate
AnnoCPAN: Annotated CPAN documentation
CPAN Ratings
Search CPAN
ACKNOWLEDGEMENTS
LICENSE AND COPYRIGHT
This software is Copyright (c) 2020->2021 by LNATION.
This is free software, licensed under:
The Artistic License 2.0 (GPL Compatible)