Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/trassmann/schermz

Generate a schema from JSON objects
https://github.com/trassmann/schermz

cli generator json model schema

Last synced: 4 days ago
JSON representation

Generate a schema from JSON objects

Awesome Lists containing this project

README

        

# schermz

A CLI tool to create a schema from a JSON file.

## Installation

This tool is written in Rust, so you'll need to install the [Rust toolchain](https://www.rust-lang.org/tools/install) to build it.

```bash
cargo install schermz
```

## Usage

```bash
A tool to generate a schema for a given JSON file.

Usage: schermz [OPTIONS] --file

Options:
-f, --file Path to the JSON file
-m, --merge-objects Whether to merge object types into one
-h, --help Print help
-V, --version Print version
```

## The `-m` argument

When this argument is passed to schermz, all objects for the same key will be merged into one, meaning, if a key can have multiple different object shapes, they will not be listed separately. This is useful when you want to get a general idea of the data, or you trust that the data is consistent.

Here's a simple example:

`sample.json`

```json
[
{
"info": {
"name": "Martin",
"age": 30
}
},
{
"info": {
"name": "Paul"
}
}
]
```

### Without `-m` (default)

```bash
schermz -f ./sample.json

{
"info": {
"types": [
{
"age": {
"types": [
"NUMBER"
]
},
"name": {
"types": [
"STRING(6)"
]
}
},
{
"name": {
"types": [
"STRING(4)"
]
}
}
]
}
}
```

### With `-m`

```bash
schermz -m -f ./sample.json

{
"info": {
"types": [
{
"age": {
"types": [
"NUMBER"
]
},
"name": {
"types": [
"STRING(4, 6)"
]
}
}
]
}
}

```

## Output

String values are analyzed based on their possible lengths.

- `STRING(0, 10)` - This field is a string with a minimum length of 0 (`""`) and a maximum length of 10.
- `STRING(5)` - This field is a string with a length of 5.

## Example

`sample.json`

```json
[
{
"name": "Sherlock Holmes",
"title": "",
"age": 34,
"personal_data": {
"gender": "male",
"marital_status": "single"
},
"address": {
"street": "10 Downing Street",
"city": "London",
"zip": "12345",
"country_code": "UK"
},
"phones": ["+44 1234567", "+44 2345678", 12311, { "mobile": "+44 3456789" }]
},
{
"name": "Tony Soprano",
"title": "",
"age": 39,
"personal_data": {
"gender": "male",
"marital_status": "married"
},
"address": {
"street": "14 Aspen Drive",
"city": "Caldwell",
"zip": "NJ 07006",
"country": "USA",
"state": "New Jersey",
"country_code": "US"
},
"phones": [
"+1 1234567",
"+1 2345678",
"+1 11111111111",
"+1 301234566",
11224234,
{ "mobile": "+1 3456789" }
]
},
{
"name": "Angela Merkel",
"title": "",
"age": 65,
"personal_data": {
"gender": "female",
"marital_status": "married"
},
"address": {
"street": "Gr. Weg 3",
"city": "Potsdam",
"zip": "14467",
"country": "Germany",
"state": "Brandenburg"
},
"phones": [
"+49 1234222567",
"+49 2343231678",
"+49 1111131111111",
"+49 301212334566",
9999222,
{ "mobile": "+49 343156789", "fax": "+49 343156780" }
]
},
{
"name": "Jane Doe",
"title": "Dr.",
"age": "73",
"personal_data": {
"gender": "female"
},
"address": null,
"phones": null
}
]
```

```bash
schermz -f ./sample.json

{
"address": {
"types": [
"NULL",
{
"city": {
"types": ["STRING(6)"]
},
"country_code": {
"types": ["STRING(2)"]
},
"street": {
"types": ["STRING(17)"]
},
"zip": {
"types": ["STRING(5)"]
}
},
{
"city": {
"types": ["STRING(8)"]
},
"country": {
"types": ["STRING(3)"]
},
"country_code": {
"types": ["STRING(2)"]
},
"state": {
"types": ["STRING(10)"]
},
"street": {
"types": ["STRING(14)"]
},
"zip": {
"types": ["STRING(8)"]
}
},
{
"city": {
"types": ["STRING(7)"]
},
"country": {
"types": ["STRING(7)"]
},
"state": {
"types": ["STRING(11)"]
},
"street": {
"types": ["STRING(9)"]
},
"zip": {
"types": ["STRING(5)"]
}
}
]
},
"age": {
"types": ["NUMBER", "STRING(2)"]
},
"name": {
"types": ["STRING(8, 15)"]
},
"personal_data": {
"types": [
{
"gender": {
"types": ["STRING(4, 6)"]
},
"marital_status": {
"types": ["STRING(6, 7)"]
}
},
{
"gender": {
"types": ["STRING(6)"]
}
}
]
},
"phones": {
"types": [
"NULL",
{
"ARRAY": [
{
"mobile": {
"types": ["STRING(10, 11)"]
}
},
{
"fax": {
"types": ["STRING(13)"]
},
"mobile": {
"types": ["STRING(13)"]
}
},
"NUMBER",
"STRING(10, 17)"
]
}
]
},
"title": {
"types": ["STRING(0, 3)"]
}
}

```