BON:JSON 的超集,配置界的 SASS
为什么会有这个项目
JSON 是最流行的数据交换格式,但用它写配置有个麻烦:不能复用、不能计算、不能继承。
一个 K8s 服务配三个环境——dev、staging、prod——每个环境复制一份。改一个字段要改三处,十个服务就是三十处。YAML 解决了注释问题,但没解决复用和计算。HOCON、TOML 也一样。配置语言这么多年一直在“格式”上做文章,没人从“表达能力”入手。
BON 要解决的就是这个问题。
它是什么
一门编译期执行的声明式数据转换语言,是 JSON 的超集。所有合法 JSON 都是合法 BON。
BON 在 JSON 之上加了模板、类、继承、条件判断、循环、导入这些编程语言才有的东西,然后编译成纯 JSON。宿主程序拿到的是干干净净的 JSON,不需要内置 BON 运行时。
代码登录后可见
输出的 JSON:
代码登录后可见
能做什么
模板系统:用 代码登录后可见 定义可复用片段,通过 代码登录后可见 引用,深拷贝展开,互不干扰。
类与继承:代码登录后可见 定义数据结构,代码登录后可见 继承,支持属性覆盖和方法继承。计算属性用 代码登录后可见。
条件判断:代码登录后可见 编译期分支,支持表达式上下文(必须带 else)和对象块上下文(else 可选)。
循环:代码登录后可见 遍历数组、对象或范围(左闭右开,上限 10000 次),编译期展开。
编译时参数:代码登录后可见 注入外部值,实现环境差异化配置。未传入参数抛出 E009 错误。
标准库:字符串(upper/lower/trim/split/replace)、数组(map/filter/reduce/concat/at/first/last)、对象(merge/keys/values),全部是纯函数。
导入系统:代码登录后可见,支持别名和循环导入检测(E008)。
注释:代码登录后可见 和 代码登录后可见,JSON 标准不允许的,BON 支持。
怎么做的
编译流程:参数注入 → 词法/语法分析 → 导入解析 → 控制流展开 → 模板展开 → 常量折叠 → 纯 JSON。
BON 是图灵不完备的——没有无限循环、没有随机数、没有系统时间。相同源码在任何环境编译,输出完全一致。它不会滑向“用配置写业务逻辑”那个方向。
错误处理走 Fail Fast 原则,11 种错误类型(E001–E011),覆盖缺失参数、循环超限、循环导入等常见问题。
使用方式
BON 提供 Python 和 TypeScript 两套实现,语义完全一致。
命令行:
代码登录后可见
代码里调用:
代码登录后可见
代码登录后可见
VS Code 扩展提供语法高亮、自动补全、错误诊断、跳转定义。
项目结构
代码登录后可见
Python 和 TypeScript 两套实现共享同一套测试用例,保证行为完全一致。
谁适合用
- 用 K8s 配多环境的
- 维护一堆 Docker Compose 文件的
- 游戏配置表写到吐的
- 微服务之间共享公共配置的
- 任何觉得“JSON 不够用”的人
现状
项目持续开发中。测试覆盖包括单元测试和集成测试,Python 和 TypeScript 两套实现共享测试夹具,保证跨语言一致性。
相关链接
- 项目地址:github.com/TT23XR-Studio/BON/
- KossJS 文档:docss.sxxyrry.qzz.io/BON/
- TT23XR Studio 官网:tt23xr.sxxyrry.qzz.io/
Apache-2.0 许可证,欢迎使用和贡献。