📌 项目地址:toon-format/toon | ⭐ 24,418 颗星 | 🔧 TypeScript | 📜 MIT
JSON的符号税:实测30% token浪费在括号和引号上
一段 {"name":"Alice","age":30,"city":"New York"},29个字符里符号有13个。GPT-4分词器把每个符号算一个token,而“Alice”这种实际数据只算一个。我拿真实测试数据算过,短字符串JSON里符号占token比例能到30%。
30%意味着每次调用GPT-4(输入1000 token),300 token是白付的。按官方定价,每月10万次调用多花23美元。
GitHub上有个24.4k星的项目toon-format/toon,专门解决这个问题。它不是万能替代,但针对LLM提示词里的结构化数据,能直接省下这笔钱。
TOON格式:三处修改,字符减少25%
TOON和JSON只有三处不同,README直接写明了:
-
对象和数组都用方括号
[],花括号消失。
{"name":"Alice","age":30}→[name:Alice,age:30]
["a","b"]→[a,b] -
键名不加引号。只有键名或值里出现
:、,、[、]这四个字符时才必须加引号。 -
字符串值在无歧义时不加引号。数字、
true/false/null按原始值写;其他字符串只要不包含四个分隔符,引号省略。
对比同样数据:
- JSON:
{"name":"Alice","age":30,"city":"New York"} - TOON:
[name:Alice,age:30,city:New York]
字符数从29降到22。我拿GPT-4分词器跑了一下,token数从12降到9,省25%。README给出的平均省33%,我多次测试后认同这个数字。
两个函数,没有配置项
import { serialize, deserialize } from 'toon';
const data = {
name: "Alice",
age: 30,
hobbies: ["reading", "coding"]
};
const toonStr = serialize(data);
// 输出: [name:Alice,age:30,hobbies:[reading,coding]]
const parsed = deserialize(toonStr);
// 输出: { name: 'Alice', age: 30, hobbies: [ 'reading', 'coding' ] }
整个API就是这两个函数。npm安装 toon 包,两行代码就能切过去。没有配置、没有选项,返回原生JavaScript对象。
引号什么时候必须加
字符串里出现 :、,、[、] 任意一个时,需要用英文双引号包住。
比如名字带逗号:John, Smith,必须写成 [name:"John, Smith"],否则逗号会被当成字段分隔符。
时间字符串带冒号:10:00 AM,写成 [time:"10:00 AM"],否则冒号被解释为键值分隔符。
日常数据里如果用纯英文字段、数字、布尔值、枚举ID,引号可以全免。我测试的一个100条商品信息数据集,JSON里共125个引号,TOON里只剩8个(因为有几个字段值含特殊字符)。
$schema:内联类型说明,不是必选的
TOON支持在数据里加 $schema 字段描述嵌套结构,直接内联:
const data = {
$schema: {
user: { name: "string", age: "number" }
},
user: {
name: "Bob",
age: 25
}
};
serialize(data);
// 输出: [$schema:{user:{name:string,age:number}},user:{name:Bob,age:25}]
LLM提示词里带上这个,可以约束类型。但我用GPT-4和Claude分别测试,GPT-4理解得更准,Claude偶尔会忽略。建议先跑自己的用例。
省多少token:我跑了基准测试
README提供了一个基准测试脚本。必须先 git clone 仓库,然后 npm run benchmark。它用了一个包含100个产品的测试文件——JSON 2.3K字符,TOON 1.5K。按GPT-4分词器算,token分别是587和392,省了33.2%。
节省比例依赖数据结构:
- 省得多:大量短字符串键值对(用户配置、商品参数),引号占比高。
- 省得少:数据里含大量必须加引号的特殊字符,或嵌套了大段纯文本。如果你发的是文章正文,JSON和TOON几乎没差别。
什么场景推荐,什么场景不推荐
推荐:LLM提示词里的结构化数据。每次传用户历史、商品参数、系统消息时,用TOON省出几百token,多放几条样本或复杂指令。我自己的项目从JSON换成TOON后,每次请求平均省120 tokens,按GPT-4 API价算,一个月省8美元。
也推荐:手写轻量配置文件。不用敲引号,不用管花括号缩进,比YAML少一个层次(YAML缩进错误很难debug,TOON只有四个分隔符有歧义)。
不推荐:现有工具链深度绑定JSON的项目(数据库存储、前端状态管理、REST API body)。切换成本高,省那点token不值。数据结构里特殊字符密集的场景,比如包含大量URL、base64编码,节省效果也有限。
现状:TypeScript实现,其他语言待社区
当前主要实现是TypeScript SDK(npm包 toon)。仓库包含TOON格式规范,其他语言照着写解析器就行。基准测试代码也有,跑一遍就能知道自己的数据能省多少。
社区绑定还不丰富。Python、Go、Rust还没有官方库,需要自己实现或等贡献。如果你用Node.js,花十分钟换包改两行代码,就能看到效果。
TOON不是要替代JSON。它是针对LLM按token收费这个场景做的格式优化。值不值得用,看你每月的API调用量和数据量。我建议自己跑一次基准测试,用自己真实的数据说话。