Zig Cookbook

介绍

序列化和反序列化 JSON

std.json 模块提供了 parseFromSlice 用于反序列化 JSON,以及 json.Stringify 结构体通过 Io.Writer.Allocating 将值序列化回 JSON。

下面的示例显示了解析 JSON 的 []u8。逐个比较每个成员。 然后,我们将 verified 字段修改为 false,并将其序列化回 JSON 字符串。

const std = @import("std");
const json = std.json;
const testing = std.testing;

pub fn main(init: std.process.Init) !void {
    const allocator = init.gpa;

    // Deserialize JSON
    const json_str =
        \\{
        \\  "userid": 103609,
        \\  "verified": true,
        \\  "access_privileges": [
        \\    "user",
        \\    "admin"
        \\  ]
        \\}
    ;
    const T = struct { userid: i32, verified: bool, access_privileges: [][]u8 };
    const parsed = try json.parseFromSlice(T, allocator, json_str, .{});
    defer parsed.deinit();

    var value = parsed.value;

    try testing.expect(value.userid == 103609);
    try testing.expect(value.verified);
    try testing.expectEqualStrings("user", value.access_privileges[0]);
    try testing.expectEqualStrings("admin", value.access_privileges[1]);

    // Serialize JSON
    value.verified = false;
    var out = std.Io.Writer.Allocating.init(allocator);
    defer out.deinit();
    var stringifier = json.Stringify{
        .writer = &out.writer,
        .options = .{
            .whitespace = .indent_2,
        },
    };
    try stringifier.write(value);

    try testing.expectEqualStrings(
        \\{
        \\  "userid": 103609,
        \\  "verified": false,
        \\  "access_privileges": [
        \\    "user",
        \\    "admin"
        \\  ]
        \\}
    , out.writer.buffered());
}

上一示例:解析版本字符串
下一示例:序列化和反序列化 ZON