#json-schema #dsl #array

bin+lib json-schema-dsl

一个简单的 DSL,用于编写 JSON Schema

3 个不稳定版本

新增 0.2.1 2024 年 8 月 14 日
0.2.0 2024 年 8 月 13 日
0.1.0 2024 年 8 月 12 日

命令行实用程序 中排名 675

Download history 327/week @ 2024-08-10

每月下载量 327

Apache-2.0

335KB
539 行(不包括注释)

JSON Schema DSL

一个简单的 DSL,可以一行代码生成 JSON Schema。

为什么需要 JSON Schema DSL?

  1. 使 JSON Schema 更简洁: JSON Schema DSL CLI

  2. 对 AI 友好:函数调用,简单的 DSL 生成结构化输出: JSON Schema DSL CLI

  3. 对 CSV、Excel、Text2SQL 友好: JSON Schema DSL CLI

开始使用

CLI: cargo install json-schema-dsl

$ json-schema-dsl "User{ id: int, name: string, email: Email}"

输出如下

{
  "$schema": "http://json-schema.fullstack.org.cn/draft/2020-12/schema",
  "title": "User",
  "type": "object",
  "properties": {
    "id": {
      "type": "integer"
    },
    "name": {
      "type": "string"
    },
    "email": {
      "type": "string",
      "format": "email"
    }
  },
  "required": [
    "id",
    "name",
    "email"
  ]
}

Rust 库: cargo add json-schema-dsl serde_json

fn main() {
    let struct_text = "User {id: int, name: string, email: Email}";
    let json_schema = json_schema_dsl::to_json_schema(struct_text).unwrap();
    println!("{}", serde_json::to_string_pretty(&json_schema).unwrap());
}

语法

JSON Schema DSL

用户{id:int,name:string,birth_date:Date,email?:Email,tags: List<string>}

  • 对象名称:以大写字母开头,例如 ObjectName { field: type }.
  • 字段名称:以小写字母开头。
  • 可选字段: field?: type

基本类型

JSON Schema 基本类型

  • string:别名:varcharTextStringbytesbytea(base64)
  • integer:别名:intbigintlongserialbigserial
  • number:别名:floatdoublerealdecimal
  • boolean:别名:bool

数组类型

数组类型类似于 List<T>,其中 T 是基本类型或格式名称。

  • List:别名:list
  • Array:别名:array
  • Set(唯一项):别名:set

对象类型

声明对象类型:field: ObjectName {field: type}

注意ObjectName 应以大写字母开头。

格式

JSON Schema 格式,名称应大写开头

  • Date
  • 时间
  • 日期时间
  • 时间戳
  • 间隔
  • 持续时间
  • Email
  • 主机名
  • IPv4
  • IPv6
  • URI
  • 主机名
  • UuidUUID
  • JsonJSON:JSON 文本
  • XmlXML:XML 文本

其他

  • 范围:age: int(18,)age: int(,150)age: int(1,18)
  • 字符串长度范围:nick: string(6,32)varchar(32)
  • 数组项长度范围:list<string>(2)list<float>(1536)
  • 元组:income: [int, string]
  • 枚举:enum('a', 'b', 'c')enum(1, 2, 3)
  • 正则表达式:regex('^[a-z]+$')
  • anyOf:field: type1|type2,类型之间无空格
  • additionalProperties:{field: type, ...},在 } 前使用省略号。

参考

依赖关系

~3-4MB
~51K SLoC