AIDotNet.Toon 0.1.3

dotnet add package AIDotNet.Toon --version 0.1.3
                    
NuGet\Install-Package AIDotNet.Toon -Version 0.1.3
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="AIDotNet.Toon" Version="0.1.3" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="AIDotNet.Toon" Version="0.1.3" />
                    
Directory.Packages.props
<PackageReference Include="AIDotNet.Toon" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add AIDotNet.Toon --version 0.1.3
                    
#r "nuget: AIDotNet.Toon, 0.1.3"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package AIDotNet.Toon@0.1.3
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=AIDotNet.Toon&version=0.1.3
                    
Install as a Cake Addin
#tool nuget:?package=AIDotNet.Toon&version=0.1.3
                    
Install as a Cake Tool

AIDotNet.Toon

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 AIDotNet.Toon

源代码方式:

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

字节与流:

// 字节
var bytes = ToonSerializer.SerializeToUtf8Bytes(rows);
var rowsFromBytes = ToonSerializer.Deserialize<List<Dictionary<string, object>>>(bytes);

// 流
using var ms = new MemoryStream();
ToonSerializer.Serialize(rows, ms);   // 写入 UTF-8(无 BOM),保持流打开
ms.Position = 0;
var rowsFromStream = ToonSerializer.Deserialize<List<Dictionary<string, object>>>(ms);

特殊数值处理:

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/AIDotNet.Toon.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 © AIDotNet.Toon Contributors

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

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • net10.0

    • No dependencies.
  • net8.0

    • No dependencies.
  • net9.0

    • No dependencies.

NuGet packages (2)

Showing the top 2 NuGet packages that depend on AIDotNet.Toon:

Package Downloads
AIDotNet.Toon.Benchmarks

Package Description

AIDotNet.Toon.ModelBenchmarks

Package Description

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.1.3 723 11/8/2025
0.1.1 201 11/7/2025
0.1.0 211 11/4/2025