在 LLM API 调用按 Token 计费的时代,你还在为 JSON 的冗余格式买单吗?今天给大家推荐一个专为 Java 开发者打造的高效序列化库 ——TOON-Java,让你的 LLM 交互成本直接砍半!
为什么需要 TOON?
当我们用 JSON 和 GPT/Anthropic 等大模型交互时,大量的引号、括号其实都是无效 Token。而 TOON(Text-Oriented Object Notation)通过表格化存储 + 元数据前置的设计,平均节省 30-60% 的 Token 消耗,实测调用成本直接降一半!
更重要的是,它兼顾了人类和 LLM 的可读性,字段注释原生支持,让模型更懂你的数据结构,减少解析幻觉。(toon官方地址:github.com/toon-format…
✨ 核心优势一览
🔍 快速上手(3 分钟入门)
1. 引入依赖(Maven)
xml
<dependency>
<groupId>com.github</groupId>
<artifactId>toon-java</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
2. 定义带注释的实体类
// 地址类(嵌套对象)
class Address {
@ToonField(order = 1, comment = "街道地址,含门牌号")
private String street;
@ToonField(order = 2, comment = "城市名称")
private String city;
// 构造函数+getter/setter
}
// 用户类
class User {
@ToonField(order = 1, comment = "用户唯一ID")
private int id;
@ToonField(order = 2, comment = "用户名(最长32字符)")
private String name;
@ToonField(order = 3, comment = "注册时间(ISO格式)")
private LocalDateTime registerTime;
@ToonField(order = 4, comment = "用户地址")
private Address address;
// 构造函数+getter/setter
}
3. 序列化与反序列化
public class Demo {
public static void main(String[] args) throws ToonException {
// 构建数据
Address addr = new Address("123 Main St", "New York");
List<User> users = List.of(
new User(1, "Alice", LocalDateTime.now(), addr)
);
// 序列化(带字段注释)
String toonStr = Toons.serialize("users", users);
System.out.println("TOON结果:\n" + toonStr);
// 反序列化
List<User> data = Toons.deserialize(toonStr, List.class);
}
}
输出效果(Token 直接省一半)
users(1){id#用户唯一ID,name#用户名(最长32字符),registerTime#注册时间(ISO格式),address#用户地址{street#街道地址,含门牌号,city#城市名称}}:
1,Alice,2024-05-20T15:30,;
address#用户地址{street#街道地址,含门牌号,city#城市名称}:
street: 123 Main St
city: New York
🎯 哪些场景一定要用?
- 按 Token 计费的 LLM API 调用(OpenAI/Anthropic 等)
- RAG 知识库数据传输(平衡可读性和效率)
- AI Agent 交互(结构化指令更清晰)
- 大规模 LLM 应用(成本敏感型项目必选)
📌 注意事项
- 不适合跨语言极致兼容场景(优先 JSON)
- 深度嵌套非表格数据建议用 JSON
- 极简数据结构且追求速度可选 Protobuf
目前项目基于 Apache 2.0 开源,已支持 JDK 1.8+,欢迎 Star 和 PR!无论是个人项目还是企业级应用,都能显著降低 LLM 交互成本,感兴趣的宝子们赶紧来试用吧😄
👉 Github github.com/wuahhh/toon…