序列化和反序列化 JSON
std.json 提供了一组函数,如 stringify 和 stringifyAlloc,用于序列化 JSON。 此外,我们可以使用 parseFromSlice 函数来解析 JSON 的 []u8。
下面的示例显示了解析 JSON 的 []u8。逐个比较每个成员。 然后,我们将 verified 字段修改为 false,并将其序列化回 JSON 字符串。
const std = @import("std");
const json = std.json;
const testing = std.testing;
pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
const allocator = gpa.allocator();
// 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());
}