jojo1981 / json-schema-asg
Json schema abstract semantic graph builder
Requires
- php: ^8.0
- ext-json: *
- league/uri: ^6.8
- league/uri-components: ^2.4
- symfony/yaml: ^4.2
This package is auto-updated.
Last update: 2024-12-07 16:55:51 UTC
README
Author: Joost Nijhuis <jnijhuis81@gmail.com>
A PHP Implementation for building an ASG (Abstract semantic graph) from a reference to a JSON schema file
.
Support for json schemas defined in JSON
and YAML
.
Full support for the JSON schema draft 07 specification. More information can be found here.
The ASG is visitable and can be visited by implementing a visitor (Behavioral Design Pattern Visitor).
Purposes of this library are:
- Validate JSON Schemas and give the end user a precise error message about semantically errors
- Transform an ASG into something else. For example generate entity classes from it, generate static validation classes, etc...
- Travers ASG by implementing your own visitor. (implement
Jojo1981\JsonSchemaAsg\Visitor\VisitorInterface
)
JSON Schema is a vocabulary that allows you to annotate and validate JSON documents. More information can be found here.
Installation
Library
git clone https://github.com/jojo1981/json-schema-asg.git
Composer
composer require jojo1981/json-schema-asg
Implement your own visitor.
Make sure when implementing the method: visitReferenceNode
you check if the reference is circular.
for example:
/** * @param ReferenceNode $referenceNode * @return mixed */ public function visitReferenceNode(ReferenceNode $referenceNode) { if (!$referenceNode->isCircular()) { $referenceNode->getPointToSchema()->accept($this); } }
Usage
Make sure the reference is an absolute reference to a url or file on the local file system.
<?php require 'vendor/autoload.php'; $schemaResolverFactory = new Jojo1981\JsonSchemaAsg\SchemaResolverFactory(); $schemaResolver = $schemaResolverFactory->getSchemaResolver(); // Example local files $schemaFilenames = [ 'resources/schemas/address.schema.json', 'resources/schemas/calendar.schema.json', 'resources/schemas/card.schema.json', 'resources/schemas/customer.schema.json', 'resources/schemas/geographical-location.schema.json' ]; foreach ($schemaFilenames as $relativeSchemaFilename) { $absoluteSchemaFilename = \realpath($relativeSchemaFilename); $reference = new Jojo1981\JsonSchemaAsg\Value\Reference($absoluteSchemaFilename . '#/'); $schema = $schemaResolver->resolveSchema($reference); } // Example urls $schemaUrls = [ 'https://raw.githubusercontent.com/jojo1981/json-schema-asg/master/resources/schemas/address.schema.json', 'https://raw.githubusercontent.com/jojo1981/json-schema-asg/master/resources/schemas/calendar.schema.json', 'https://raw.githubusercontent.com/jojo1981/json-schema-asg/master/resources/schemas/card.schema.json', 'https://raw.githubusercontent.com/jojo1981/json-schema-asg/master/resources/schemas/customer.schema.json', 'https://raw.githubusercontent.com/jojo1981/json-schema-asg/master/resources/schemas/geographical-location.schema.json' ]; foreach ($schemaUrls as $schemaUrl) { $reference = new Jojo1981\JsonSchemaAsg\Value\Reference($schemaUrl . '#/'); $schema = $schemaResolver->resolveSchema($reference); }