Zig版JSONみたいな「ZON」について

に公開

ZON(Zig Object Notation)は、Zigで使われているテキストファイルフォーマットです。
ZONはZigのビルドシステムのbuild.zig.zonで使われています。
JSONの構文がJavaScriptのオブジェクトの表記法に由来しているように、ZONの構文はZigの文法に由来しています。
ZONの構文は基本的にZigの文法のサブセットですが、Zigとは異なりNaNと無限大を表すリテラル(naninf)があるという違いがあります。

.{
    .a = 1.5,
    .b = "hello, world!",
    .c = .{ true, false },
    .d = .{ 1, 2, 3 },
}

JSONとの違い

JSONとは異なり、ZONはコメントを書くことができます。

// コメント
10

また、末尾にコンマを付けることができます。

with_comma.zon
.{
    .a = 1.5,
    .b = "hello, world!",
    .c = .{
        true,
        false,
    },
    .d = .{
        1,
        2,
        3,
    },
}
without_comma.zon
.{ .a = 1.5, .b = "hello, world!", .c = .{ true, false }, .d = .{ 1, 2, 3 } }

以下のようにZONファイルに対してzig fmtを実行することでフォーマットできます。

$ zig fmt foo.zon
foo.zon

整数リテラルは10進数以外に2進数、8進数、16進数でも表記できます。

.{
    .hex = 0xff,
    .octal = -0o77,
    .binary = 0b11,
}

シリアライズとデシリアライズ

Zig 0.14.0で追加されたstd.zonを使うことでZONのシリアライズとデシリアライズができます。
std.zon.parseの提供する機能でデシリアライズができ、std.zon.stringifyの提供する機能でシリアライズができます。

また、以下のように@importを使うとコンパイル時にZONをデシリアライズできます。

const foo: Foo = @import("foo.zon");

参考文献

GitHubで編集を提案

Discussion