TSON - 一种带有不可变、哈希固定的模式的JSON超集
具有不可变模式的数据。TSON(类型模式对象表示法)是一种模式系统,具有不可变的、哈希固定的模式,其定义本身就是数据。文档命名其模式,模式命名其元模式;一个哈希验证整个链。最后一点,TSON的数据格式是您会真正享受编写的以Unicode为首的JSON超集。TSON数据和模式文档共享相同的词法解析器、相同的工具、相同的验证。模式是具有紧凑语法且易于阅读和编写的映射。在这个模式中,person是一个有两个字段的记录;employee将person与department和level结合;level字段是一个具有默认值的枚举;所有字段默认都是必需的。试试吧,跳过阅读,直接运行。已有一个有效实现:tson-java。命令行工具的init-example命令为您写一个示例模式和数据文档的一对。您可以使用validate命令查看数据是如何根据模式进行验证的。破坏数据(例如,给年龄加引号,删除一个字段),它会一次报告每个问题,每个问题都有路径和原因。获取实现 → TSON模式 基于坚实基础构建的简洁模式。您将在验证代码中分散的合同,现在在声明中明确表示。基础:一系列十八篇的研究,从基础原则理解JSON及推导模式,在任何语法或代码书写之前。§5.2 记录和字段状态字段默认是必需的。~提供默认值,=固定值,?使字段可选。五种状态,每种在声明中都是明确的。schema config => { host : text port : integer ~ 8080 retries : integer = 3 comment : text ? } data !config { host : "prod.db.internal" port : 5555 } §5.3 数组、元组、集合大小相同的同质数组、固定形状的元组、唯一成员集合。三个合同在数据中都以一种括号语法呈现。schema tags => [ text ; 1..10 ] point => [ number , number ] badges => set < text > data (数组、元组和集合均编码为数组) !tags [ urgent reviewed ] !point [ 3.5 7.2 ] !badges [ alpha beta ] §5.5 原子和枚举通过^对原子的约束词汇进行细化,或通过构造函数新建一个原子系列。细化是其来源;枚举是其自己的家族。schema port => !integer ^ { min : 1 max : 65535 } sku => !text ^ { pattern : "[A-Z]-[0-9]{3}" } rank => !enum [ L1 L2 L3 ] data !port 8080 !sku "A-123" !rank L2 §5.8 组合具有声明的祖先的新字段:ticket IS-A audit,且贡献的字段集必须不相交。没有隐式覆盖,没有钻石歧义。schema audit => { created : datetime updated : datetime ? } ticket => audit & { id : uuid title : text } data !ticket { created : 2026-07-01T09:00:00Z id : 550e8400-e29b-41d4-a716-446655440000 title : "Server unreachable" } §5.7 细化在不添加任何字段的情况下收紧继承字段:默认值可以移动,固定值不能,合同只能窄化。一个过渡表控制每一步。schema service => { host : text port : integer ~ 8080 } production => service ^ { port : = 443 } data (端口固定为443;值不需要重复) !production { host : "prod.internal" } §5.9 减法允许移除,且是显而易见的:public不能替代account,解析的输出准确记录了这一点。schema account => { user : text email : text password : text } public => account - { password } data !public { user : "ada" email : "ada@example.com" } §5.4 选择和合成类型。结构性不相交的变种在数据中不需要标签;重叠的变种需要一个。解析器根据编码推导出类型。schema shape => ( circle | rect ) circle => { radius : number } rect => { width : number height : number } shapes => [ shape ; 1..5 ] data (记录需要类型标签) !shapes [ !circle { radius : 4 } !rect { width : 2 height : 3 } ] §5.11 字段组确切的一个:结构上声明:数据以其自身标签携带一个成员,且不创造合成标签。schema contact => { name : text ( email : email | phone : text ) } data (仅允许电话或电子邮件) !contact { name : "Grace Hopper" phone : "555-0142" } §5.10 模板带空白的定义,涵盖类型参数和值参数。一个完全绑定的应用程序在解析的模式中变成一个真实的、命名的类型。schema paged => < T > { items : [ T ] cursor : text ? } retry_policy => < N > { attempts : integer ~ N } checkout => retry_policy < 5 > data !checkout { attempts : 10 } 模式版本控制轻松添加新必需字段版本2刚刚向person记录添加了一个新的必需email字段。在可变模式系统中,添加新的必需字段是被普遍禁止的。Google、Microsoft和Zalando的API指南均禁止此做法。Protobuf甚至将required关键字标记为开发人员必须避免的危险。这些规则的存在是因为单个定义被迫为所有根据它撰写的文档服务。TSON消除了这一负担,因为模式是
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡