JSON Schema DSL
A simple DSL to generate JSON Schema with one-liner style.
Why JSON Schema DSL?
-
Make JSON Schema concise:
-
AI friendly: Function calling, Structured Output with simple DSL:
-
Schema friendly for CSV, Excel, Text2SQL:
Get Started
CLI: cargo install json-schema-dsl
$ json-schema-dsl "User{ id: int, name: string, email: Email}"
Output as following:
Rust library: cargo add json-schema-dsl serde_json
Syntax
User { id: int, name: string, birth_date: Date, email?: Email, tags: List<string>}
- Object Name: starts with capital character, such as
ObjectName { field: type }
. - Field name: starts with lower-case character.
- Optional field:
field?: type
Basic Types
JSON Schema basic types:
string
: aliases:varchar
,Text
,String
,bytes
orbytea
(base64)integer
: aliases:int
,bigint
,long
,serial
,bigserial
,int32
,int64
,int96
,int128
number
: aliases:float
,double
,real
,decimal
boolean
: aliases:bool
Extra Types
Extra types are for semantic meaning, and they are all string type.
Path
:/path/to/file
S3Path
:s3://bucket/key
Ulid
orULID
Color
:#F7F8FA
Isbn
orISBN
:978-3-16-148410-0
SemVer
:1.2.3
PhoneNumber
:+1-202-555-0192
CreditCard
:4111 1111 1111 1111
Currency
:USD
,CNY
Language
:en
,zh-CN
Locale
:en-US
,zh-CN
MimeType
:application/json
Base64
: base64 encoded string
array Types
array type is alike List<T>
, and T is a basic type or format name.
List
: aliases:list
Array
: aliases:array
Set
(uniqueItems): aliases:set
object Type
Declare object type: field: ObjectName {field: type}
.
Attention: ObjectName
should start with Capital Character.
Formats
JSON Schema formats, and name should start with a capital letter:
Date
Time
Datetime
Timestamp
Interval
Duration
Email
Hostname
Domainname
Ipv4
Ipv6
Uri
Uuid
orUUID
Json
orJSON
: JSON textXml
orXML
: XML text
Misc
- range:
age: int(18,)
,age: int(,150)
orage: int(1,18)
- string length range:
nick: string(6,32)
,varchar(32)
- array items length range:
list<string>(2)
,list<float>(1536)
- tuple:
income: [int, string]
- enum:
enum('a', 'b', 'c')
orenum(1, 2, 3)
- regex:
regex('^[a-z]+$')
- anyOf:
field: type1|type2
, no space between types - additionalProperties:
{field: type, ...}
, ellipsis before}
.
References
- JSON Schema: https://json-schema.org/
- JSON Schema formats: https://json-schema.org/understanding-json-schema/reference/string#built-in-formats
- M-Schema: a semi-structure representation of database schema - https://github.com/XGenerationLab/M-Schema