sintese / jsonflatten
Requires
- ext-json: *
- justinrainbow/json-schema: ^5.2
Requires (Dev)
- roave/security-advisories: dev-latest
This package is auto-updated.
Last update: 2024-11-04 20:04:55 UTC
README
Estudo de caso para Tabulação e Expansão de objetos construídos a partir de um json-schema.
Definição de Uso
Dado a definição de um objeto especificada por um json-schema:
$schema = <<<JSON { "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://example.com/product.schema.json", "title": "Product", "description": "A product from Acme's catalog", "type": "object", "properties": { "productId": { "description": "The unique identifier for a product", "type": "integer" }, "dimensions": { "type": "object", "properties": { "width": { "type": "number" }, "height": { "type": "number" } } }, "tags": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string" } } } } } } JSON
Temos por objetivo realizar a tabulação de seu conteúdo visando simplificar a sua manipulação:
echo (new SchemaFlatten())->flat(new SchemaObject($schema));
A estrutura tabulada irá compor em um mesmo nível chave (caminho) e valor (definição):
{ "$.productId": { "description": "The unique identifier for a product", "type": "integer", "path": "$.productId", "prop": "productId" }, "$.dimensions.width": { "type": "number", "path": "$.dimensions.width", "prop": "width" }, "$.dimensions.height": { "type": "number", "path": "$.dimensions.height", "prop": "height" }, "$.tags[0].name": { "type": "string", "path": "$.tags[0].name", "prop": "name" } }
Tendo a estrutura tabulada em mãos podemos criar um objeto achatado simplificando seu armazenamento:
$payload = <<<JSON { "$.productId": 1, "$.dimensions.width": 3, "$.dimensions.height": 6, "$.tags[0].name": "tag" } JSON;
Essa mesma estrutura pode ser utilizada em um segundo momento para recompor o objeto original:
echo (new SchemaFlatten())->unflat($payload);
Assumindo assim o formato especificado pelo json schema utilizado como base de tabulação:
{ "productId": 1, "dimensions": { "width": 3, "height": 6 }, "tags": [ { "name": "tag" } ] }
Contribuições
Contribuições, correções e sugestões de melhoria são muito bem-vindas.