JSON, Serialization and Parsing
39.1 std.json
Custom serialization: implement jsonStringify / jsonParse methods on your type.
The JSON API has changed several times (std.json.stringify → std.json.Stringify in 0.15). Check your version's docs.
const User = struct {
name: []const u8,
age: u32,
tags: []const []const u8 = &.{},
email: ?[]const u8 = null,
};
// Parse into a typed struct
const src =
\\{"name": "Ana", "age": 30, "tags": ["admin"]}
;
const parsed = try std.json.parseFromSlice(User, allocator, src, .{ .ignore_unknown_fields = true });
defer parsed.deinit(); // frees everything (arena-backed)
std.debug.print("{s} {d}\n", .{ parsed.value.name, parsed.value.age });
// Dynamic parsing
const dyn = try std.json.parseFromSlice(std.json.Value, allocator, src, .{});
defer dyn.deinit();
const name = dyn.value.object.get("name").?.string;
_ = name;
// Serialize
var out = std.Io.Writer.Allocating.init(allocator);
defer out.deinit();
try std.json.Stringify.value(User{ .name = "Bo", .age = 20 }, .{ .whitespace = .indent_2 }, &out.writer);
std.debug.print("{s}\n", .{out.written()});39.2 ZON, CSV and Other Formats
Compression: std.compress (flate/gzip/zlib decompression, zstd, xz, lzma). Crypto: std.crypto (SHA-2/3, BLAKE2/3, AES-GCM, ChaCha20-Poly1305, Ed25519, X25519, Argon2, bcrypt, TLS client).
Base64: std.base64.standard.Encoder.encode(&dest, src).
Community: zig-yaml, TOML parsers (zig-toml), CSV (zig-csv), MessagePack, protobuf (zig-protobuf).
const Config = struct { port: u16, host: []const u8 };
const cfg = try std.zon.parse.fromSlice(Config, allocator, ".{ .port = 8080, .host = \"localhost\" }", null, .{});
defer std.zon.parse.free(allocator, cfg);39.3 Writing Parsers
Hand-written lexers with labeled switch state machines, recursive descent parsers producing tagged-union ASTs stored in arena allocators or MultiArrayList (the Zig compiler's own tokenizer and parser are excellent references: std.zig.Tokenizer, std.zig.Ast).