I have a peculiar case. I want to load a json file into a zig struct that contains a list of points with two string fields:
pub const TpPoint = struct { name: []const u8, absFolderPath: []const u8 };
pub const Data = struct { points: []TpPoint };
for example the json data would be:
{
"points": [
{
"name": "point1",
"absFolderPath": "/"
}
]
}
now I use the following code to load the data into an ArrayListUnmanaged
pub const List = struct {
arena: heap.ArenaAllocator,
points: std.ArrayListUnmanaged(TpPoint),
pub fn deinit(list: *List) void {
list.points.deinit(list.arena.child_allocator);
list.arena.deinit();
list.* = undefined;
}
pub fn print(list: *List) void {
debug.print("{any}", .{list.points.items});
}
pub fn fromJson(allocator: mem.Allocator, payload: []const u8) !List {
var arena = heap.ArenaAllocator.init(allocator);
errdefer arena.deinit();
var res = std.ArrayListUnmanaged(TpPoint){};
errdefer res.deinit(allocator);
var stream = std.json.TokenStream.init(payload);
const parsedData = try std.json.parse(Data, &stream, .{
.allocator = allocator
});
defer std.json.parseFree(Data, parsedData, .{ .allocator = allocator });
for (parsedData.points) |p| {
try res.append(allocator, p);
}
debug.print("{any}", .{res.items});
return List{ .arena = arena, .points = res };
}
};
Continued...