Skip to content

数据类型

当前 ASUN 的 Schema 标量名是固定且精简的,只有:

  • int
  • float
  • str
  • bool

标量类型

ASUN 类型示例说明
int42, -100, 0任意 i64 范围整数
float3.14, -0.5, 1e10浮点值的文本表示
booltrue, false严格小写
str(不带引号)Alice Smith首尾空白会被 trim
str(带引号)" spaces "保留空白并支持转义
null / None(空槽)两个逗号之间没有字符

复合类型

嵌套结构体

asun
{id@int, address@{city@str, zip@str}}:(
  1,
  (Berlin, 10115)
)

数组 / 列表

asun
{id@int, tags@[str]}:(1, [rust, go, wasm])

数组也可以嵌套:

asun
[{matrix@[[int]]}]:
  ([[1, 2], [3, 4]]),
  ([[5, 6], [7, 8]])

条目列表

键值集合建模为条目结构体数组:

asun
{attrs@[{key@str, value@int}]}:([(age, 30), (score, 95)])

可选值 / 可空

空槽表示 None / null

asun
[{id@int, score@float}]:
  (1, 9.5),
  (2,    )

跨语言类型映射

ASUN 类型RustGoPythonJava / KotlinSwiftCC++ZigC#DartJS / TSPHP
inti64int64intlong / LongInt64int64_tint64_ti64longintnumber(整数)int
floatf64float64floatdouble / DoubleDoubledoubledoublef64doubledoublenumberfloat
boolboolboolboolboolean / BooleanBoolboolboolboolboolboolbooleanbool
strString / &strstringstrStringStringchar* / 缓冲区字段std::string[]const u8stringStringstringstring
null / 空槽Option<T>nil / 指针 / 空槽None可空字段 / 空槽nil / optional可空指针 / 空槽std::optional<T> / 空槽?T可空引用 / 可空值类型nullnull / undefinednull
[T]Vec<T>[]TlistList<T>[T]数组 / 重复行std::vector<T>[]TList<T> / 数组List<T>T[]索引数组
嵌套结构体structstructdict / 工厂返回对象class / data classAsunValue.object / 宿主模型struct + schema 描述符struct + 元数据宏structclass / record + schema 接口实现 AsunSchema 的类普通对象关联数组 / 对象式数组

说明

  • 所有语言共享同一套 ASUN schema 名称,只有 intfloatboolstr
  • 宿主语言的具体类型名可以不同,但对应的 ASUN 语义相同。例如 Java 用 double 承载 float,Zig 常用 []const u8 承载 str
  • JS / TS 运行时只有一种 number,因此这里的 int 表示“以整数形式编码的 number”。
  • 键值集合统一写成 entry-list,例如 [{key@str,value@str}]

语言支持总览

语言最低版本实现方式文本解码需要什么二进制解码需要什么
RustRust 1.85+基于 serde 的泛型编解码目标类型 T目标类型 T
GoGo 1.24+反射 + struct tag输出指针输出指针
PythonPython 3.8+基于 Python dict/list 的 C++ 扩展文本自带 schema,直接返回 Python 对象显式 schema 字符串
Java / KotlinJava 21+,Kotlin helper 基于 1.9+ 工具链反射 + 注解 + 类元数据目标 Class<T> 或 Kotlin reified helper目标 Class<T> / Kotlin reified helper
SwiftSwift tools 5.9+围绕 AsunValue 的原生 Swift 值模型文本自带 schema,返回 AsunValuebinary 自带足够 typed 信息,返回 AsunValue
CC11显式 schema 描述符 / 宏schema 描述符 + 输出缓冲区schema 描述符 + 输出缓冲区
C++C++17模板元数据宏(ASUN_FIELDSASUN_TYPES目标类型 T目标类型 T
ZigZig 0.15.2+comptime 类型推导目标类型 T + allocator目标类型 T + allocator
C#.NET 8+net8.0net10.0IAsunSchema + 工厂式类型化解码field bag 或 factory字段名 + 字段类型 + factory
DartDart 3.0+AsunSchema 接口 + 工厂式类型化解码field bag 或 factory字段名 + 字段类型 + factory
JS / TS支持 ES2020 的运行时运行时对象推断文本自带 schema,返回普通对象显式 schema 字符串
PHPPHP 8.4+面向数组 / zval 的原生 C++ 扩展文本自带 schema,返回数组显式 schema 参数

如何理解这张表

  • 文本 ASUN 会把 schema 写在 header 里,所以很多动态语言可以直接从文本恢复数据。
  • 二进制 ASUN 刻意不做自描述,因此大多数实现都需要额外提供:
    • 目标类型,
    • schema 描述符,
    • 或 schema 字符串。
  • 当前仓库里的 Swift 是主要例外:它的 binary API 会携带足够的 typed 信息,因此可以直接 round-trip 成 AsunValue
  • “实现方式”描述的是各语言如何把宿主语言数据映射到同一套 ASUN 文本 / 二进制格式;wire format 本身在官方实现之间保持一致。

二进制说明

ASUN-BIN 内部可能会使用定宽宿主语言原语来存储值,但这些宽度不是额外的 schema 类型名。

  • 对外 schema 仍然只有 intfloatboolstr
  • 官方实现的二进制编码统一使用小端序。
  • 定宽存储细节属于 binary codec 实现层,不属于 schema 语义层。

基于 MIT 许可证发布。