Skip to content

AIDotNet/Toon.NET

Repository files navigation

Toon.NET

Token-Oriented Object Notation(TOON)的 .NET 实现,对齐 https://github.com/toon-format/toon 规范,提供与 System.Text.Json 一致的 API 体验与选项模型。

  • 高性能编码:对象、原子数组行内、对象数组表格等路径已实现
  • 解码管线:扫描/解析/验证处于进行中,当前支持原子值回读
  • 设计遵循“最少分配、可读优先”的工程取舍

C#.ToonSerializer · C#.ToonSerializerOptions · C#.Encoders.EncodeValue() · C#.Primitives.EncodePrimitive() · C#.LineWriter

徽章

目录

安装

NuGet(待发布):

dotnet add package Toon.NET

源代码方式:

  • 将目录 src/Toon.NET 添加到解决方案,或以子模块方式引入
  • 在你的 csproj 中开启包 Readme(已在本项目配置):参阅 src/Toon.NET/Toon.NET.csproj

快速开始

序列化为 TOON:

using Toon;

var options = new ToonSerializerOptions
{
    Indent = 2,
    Delimiter = ToonDelimiter.Comma,
    Strict = true,
    LengthMarker = null
};

var data = new
{
    users = new[]
    {
        new { name = "alice", age = 30 },
        new { name = "bob", age = 25 }
    },
    tags = new[] { "a", "b", "c" },
    numbers = new[] { 1, 2, 3 }
};

string toonText = ToonSerializer.Serialize(data, options);
// users[2]{name,age}:
//   1,alice
//   2,bob
// tags[3]: a,b,c
// numbers[3]: 1,2,3

从 TOON 反序列化为 .NET(当前仅原子值稳定,其它结构将随解码器完善):

using Toon;

var s = ToonSerializer.Deserialize<string>("hello", options);   // "hello"
var n = ToonSerializer.Deserialize<double>("3.1415", options);  // 3.1415

相关 API: C#.ToonSerializer.Serialize() · C#.ToonSerializer.Deserialize()

API 与选项

公共 API:

选项模型:C#.ToonSerializerOptions

默认实例:C#.ToonSerializerOptions.Default

编码规则与格式

入口:C#.Encoders.EncodeValue()

对象:

原子数组(行内):

对象数组(表格):

混合/复杂数组(回退为列表):

原子/字符串:

行与缩进:

示例片段

简单对象:

var obj = new { a = 1, b = "x" };
var toon = ToonSerializer.Serialize(obj);
// a: 1
// b: x

原子数组(默认逗号分隔):

var arr = new[] { 1, 2, 3 };
ToonSerializer.Serialize(arr); // "[3]: 1,2,3"

对象数组(表格):

var rows = new[] { new { id = 1, name = "alice" }, new { id = 2, name = "bob" } };
ToonSerializer.Serialize(rows);
// [2]{id,name}:
//   1,alice
//   2,bob

特殊数值处理:

ToonSerializer.Serialize(new { v = double.NaN });            // "v: null"
ToonSerializer.Serialize(new { v = double.PositiveInfinity }); // "v: null"
ToonSerializer.Serialize(new { v = BitConverter.Int64BitsToDouble(unchecked((long)0x8000000000000000)) }); // "v: 0"

相关断言可见测试:tests/Toon.NET.Tests/EncodeTests.cs

性能与实现细节

本实现尽量减少分配与不必要的分支,同时保持输出可读性:

发布建议:使用 Release 构建;可考虑 R2R/ReadyToRun 提升启动性能。

对齐 TypeScript 规范

版本支持

路线图

  • 解码:扫描(Scanner)/解析(Parser)/校验(Validation)/解码器(Decoders)
  • 严格模式错误模型:提供行列与上下文的 C#.ToonFormatException
  • 归一化策略(Normalize):日期/集合等的跨语言一致性
  • 文档与示例完善,发布 NuGet 包

开发与测试

  • 运行测试:
dotnet test
  • 本地打包:
dotnet pack -c Release

贡献

欢迎提交 Issue/PR。请尽量:

  • 保持公共 API 与 System.Text.Json 风格一致
  • 在优化时以可读性/真实收益为先
  • 为新增路径与边界条件补充单元测试

许可

MIT © Toon.NET Contributors

致谢:感谢 upstream 项目 https://github.com/toon-format/toon 的设计与实现参考。

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors