我正在try 从这个页面https://ziglang.org/download/index.json获取和解析json. 我用的是Windows 11. 当我执行代码时,我得到以下错误:

error: MissingField
    C:\Program Files\zig-windows-x86_64-0.12.0-dev.1637+673a1efa2\lib\std\json\static.zig:785:17: 0x7ff6dd5dc141 in fillDefaultStructValues__anon_12928 (zig.exe.obj)
                    return error.MissingField;
                    ^
    C:\Program Files\zig-windows-x86_64-0.12.0- 
   dev.1637+673a1efa2\lib\std\json\static.zig:375:13: 0x7ff6dd4fb8d8 in innerParse__anon_10633 
   (zig.exe.obj)
                try fillDefaultStructValues(T, &r, &fields_seen);
                ^
    C:\Program Files\zig-windows-x86_64-0.12.0- 
   dev.1637+673a1efa2\lib\std\json\static.zig:140:19: 0x7ff6dd4acef4 in parseFromTokenSourceLeaky__anon_7857 (zig.exe.obj)
        const value = try innerParse(T, allocator, scanner_or_reader, resolved_options);
                      ^
    C:\Program Files\zig-windows-x86_64-0.12.0- 
    dev.1637+673a1efa2\lib\std\json\static.zig:88:5: 0x7ff6dd49a48b in 
    parseFromSliceLeaky__anon_7322 (zig.exe.obj)
        return parseFromTokenSourceLeaky(T, allocator, &scanner, options);
        ^
    C:\Users\asd\Desktop\zig\src\main.zig:33:24: 0x7ff6dd49a022 in main (zig.exe.obj)
            const parsed = try std.json.parseFromSliceLeaky(
                           ^
    run zig: error: the following command exited with error code 1:
    C:\Users\asd\Desktop\zig\zig-out\bin\zig.exe
    Build Summary: 3/5 steps succeeded; 1 failed (disable with --summary none)
    run transitive failure
    └─ run zig failure
    error: the following build command failed with exit code 1:
    C:\Users\asd\Desktop\zig\zig-cache\o\decc8983be50701f9459d8ab9008fb1a\build.exe 
    C:\Program Files\zig-windows-x86_64-0.12.0-dev.1637+673a1efa2\zig.exe 
    C:\Users\asd\Desktop\zig C:\Users\kstoy\OneDrive\Desktop\zig\zig-cache 
    C:\Users\asd\AppData\Local\zig --seed 0x1f71bf2c run

从错误中,我只能假设我的 struct 和我试图在其中解析的json之间存在一些差异,但我将 struct 字段与json的字段进行了比较,似乎并非如此.我也try 过将ignore_unknown_fields字段设置为真,但没有任何区别

以下是我的代码:

const std = @import("std");
const print = std.debug.print;
const Uri = std.Uri;
const Client = std.http.Client;
const Headers = std.http.Headers;
const FetchOptions = std.http.Client.FetchOptions;
const Location = std.http.Client.FetchOptions.Location;
const ArenaAllocator = std.heap.ArenaAllocator;

pub fn main() !void {
    var page_allocator = ArenaAllocator.init(std.heap.page_allocator);
    defer page_allocator.deinit();
    const allocator = page_allocator.allocator();

    const uri = try Uri.parse("https://ziglang.org/download/index.json");

    var client = Client{ .allocator = allocator };
    var headers = Headers{ .allocator = allocator };
    defer headers.deinit();

    try headers.append("accept", "*/*");

    var options = FetchOptions{
        .method = .GET,
        .headers = headers,
        .location = Location{ .uri = uri },
    };
    var res = try client.fetch(allocator, options);
    defer res.deinit();

    if (res.body) |body| {
        print("body: {s}", .{body});
        const parsed = try std.json.parseFromSliceLeaky(
            ZigReleases,
            allocator,
            body,
            .{ .ignore_unknown_fields = true },
        );

        const zig_releases = parsed.master;
        print("asd {}", .{zig_releases});
    } else {
        print("Request failed\n", .{});
    }
}

const ZigReleases = struct {
    master: Master,
    @"0_1_1": @"0_1_1",
    @"0_2_0": @"0_2_0",
    @"0_3_0": @"0_3_0",
    @"0_4_0": @"0_4_0",
    @"0_5_0": @"0_5_0",
    @"0_6_0": @"0_6_0",
    @"0_7_0": @"0_7_0",
    @"0_7_1": @"0_7_1",
    @"0_8_0": @"0_8_0",
    @"0_8_1": @"0_8_1",
    @"0_9_0": @"0_9_0",
    @"0_9_1": @"0_9_1",
    @"0_10_0": @"0_10_0",
    @"0_10_1": @"0_10_1",
    @"0_11_0": @"0_11_0",
};

const Master = struct {
    version: []const u8,
    date: []const u8,
    docs: []const u8,
    stdDocs: []const u8,
    src: BuildInfo,
    bootstrap: BuildInfo,
    @"x86_64-macos": BuildInfo,
    @"aarch64-macos": BuildInfo,
    @"x86_64-linux": BuildInfo,
    @"aarch64-linux": BuildInfo,
    @"armv7a-linux": BuildInfo,
    @"riscv64-linux": BuildInfo,
    @"powerpc64le-linux": BuildInfo,
    @"powerpc-linux": BuildInfo,
    @"x86-linux": BuildInfo,
    @"x86_64-windows": BuildInfo,
    @"aarch64-windows": BuildInfo,
    @"x86-windows": BuildInfo,
};

const @"0_1_1" = struct {
    date: []const u8,
    docs: []const u8,
    notes: []const u8,
    src: BuildInfo,
    @"x86_64-windows": BuildInfo,
};

const @"0_2_0" = struct {
    date: []const u8,
    docs: []const u8,
    notes: []const u8,
    src: BuildInfo,
    @"x86_64-windows": BuildInfo,
    @"x86_64-linux": BuildInfo,
};

const @"0_3_0" = struct {
    date: []const u8,
    docs: []const u8,
    notes: []const u8,
    src: BuildInfo,
    @"x86_64-macos": BuildInfo,
    @"x86_64-linux": BuildInfo,
    @"x86_64-windows": BuildInfo,
};

const @"0_4_0" = struct {
    date: []const u8,
    docs: []const u8,
    notes: []const u8,
    src: BuildInfo,
    @"x86_64-freebsd": BuildInfo,
    @"x86_64-macos": BuildInfo,
    @"x86_64-linux": BuildInfo,
    @"x86_64-windows": BuildInfo,
};

const @"0_5_0" = struct {
    date: []const u8,
    docs: []const u8,
    notes: []const u8,
    src: BuildInfo,
    @"x86_64-freebsd": BuildInfo,
    @"x86_64-macos": BuildInfo,
    @"x86_64-linux": BuildInfo,
    @"x86_64-windows": BuildInfo,
};

const @"0_6_0" = struct {
    date: []const u8,
    docs: []const u8,
    stdDocs: []const u8,
    notes: []const u8,
    src: BuildInfo,
    bootstrap: BuildInfo,
    @"x86_64-freebsd": BuildInfo,
    @"aarch64-linux": BuildInfo,
    @"armv6kz-linux": BuildInfo,
    @"armv7a-linux": BuildInfo,
    @"i386-linux": BuildInfo,
    @"riscv64-linux": BuildInfo,
    @"x86_64-linux": BuildInfo,
    @"x86_64-macos": BuildInfo,
    @"i386-windows": BuildInfo,
    @"x86_64-windows": BuildInfo,
};

const @"0_7_0" = struct {
    date: []const u8,
    docs: []const u8,
    stdDocs: []const u8,
    notes: []const u8,
    src: BuildInfo,
    bootstrap: BuildInfo,
    @"x86_64-freebsd": BuildInfo,
    @"x86_64-macos": BuildInfo,
    @"x86_64-linux": BuildInfo,
    @"x86_64-windows": BuildInfo,
    @"i386-windows": BuildInfo,
    @"i386-linux": BuildInfo,
    @"riscv64-linux": BuildInfo,
    @"armv7a-linux": BuildInfo,
    @"armv6kz-linux": BuildInfo,
    @"aarch64-linux": BuildInfo,
    @"aarch64-macos": BuildInfo,
};

const @"0_7_1" = struct {
    date: []const u8,
    docs: []const u8,
    stdDocs: []const u8,
    notes: []const u8,
    src: BuildInfo,
    bootstrap: BuildInfo,
    @"x86_64-freebsd": BuildInfo,
    @"aarch64-linux": BuildInfo,
    @"armv7a-linux": BuildInfo,
    @"i386-linux": BuildInfo,
    @"riscv64-linux": BuildInfo,
    @"x86_64-linux": BuildInfo,
    @"x86_64-macos": BuildInfo,
    @"i386-windows": BuildInfo,
    @"x86_64-windows": BuildInfo,
};

const @"0_8_0" = struct {
    date: []const u8,
    docs: []const u8,
    stdDocs: []const u8,
    notes: []const u8,
    src: BuildInfo,
    bootstrap: BuildInfo,
    @"x86_64-freebsd": BuildInfo,
    @"aarch64-linux": BuildInfo,
    @"armv7a-linux": BuildInfo,
    @"i386-linux": BuildInfo,
    @"riscv64-linux": BuildInfo,
    @"x86_64-linux": BuildInfo,
    @"aarch64-macos": BuildInfo,
    @"x86_64-macos": BuildInfo,
    @"i386-windows": BuildInfo,
    @"x86_64-windows": BuildInfo,
};

const @"0_8_1" = struct {
    date: []const u8,
    docs: []const u8,
    stdDocs: []const u8,
    notes: []const u8,
    src: BuildInfo,
    bootstrap: BuildInfo,
    @"x86_64-freebsd": BuildInfo,
    @"aarch64-linux": BuildInfo,
    @"armv7a-linux": BuildInfo,
    @"i386-linux": BuildInfo,
    @"riscv64-linux": BuildInfo,
    @"x86_64-linux": BuildInfo,
    @"aarch64-macos": BuildInfo,
    @"x86_64-macos": BuildInfo,
    @"i386-windows": BuildInfo,
    @"x86_64-windows": BuildInfo,
};

const @"0_9_0" = struct {
    date: []const u8,
    docs: []const u8,
    stdDocs: []const u8,
    notes: []const u8,
    src: BuildInfo,
    bootstrap: BuildInfo,
    @"x86_64-freebsd": BuildInfo,
    @"aarch64-linux": BuildInfo,
    @"armv7a-linux": BuildInfo,
    @"i386-linux": BuildInfo,
    @"riscv64-linux": BuildInfo,
    @"x86_64-linux": BuildInfo,
    @"aarch64-macos": BuildInfo,
    @"x86_64-macos": BuildInfo,
    @"i386-windows": BuildInfo,
    @"x86_64-windows": BuildInfo,
    @"aarch64-windows": BuildInfo,
};

const @"0_9_1" = struct {
    date: []const u8,
    docs: []const u8,
    stdDocs: []const u8,
    notes: []const u8,
    src: BuildInfo,
    bootstrap: BuildInfo,
    @"x86_64-freebsd": BuildInfo,
    @"aarch64-linux": BuildInfo,
    @"armv7a-linux": BuildInfo,
    @"i386-linux": BuildInfo,
    @"riscv64-linux": BuildInfo,
    @"x86_64-linux": BuildInfo,
    @"aarch64-macos": BuildInfo,
    @"x86_64-macos": BuildInfo,
    @"i386-windows": BuildInfo,
    @"x86_64-windows": BuildInfo,
    @"aarch64-windows": BuildInfo,
};

const @"0_10_0" = struct {
    date: []const u8,
    docs: []const u8,
    stdDocs: []const u8,
    notes: []const u8,
    src: BuildInfo,
    bootstrap: BuildInfo,
    @"x86_64-freebsd": BuildInfo,
    @"i386-windows": BuildInfo,
    @"aarch64-linux": BuildInfo,
    @"armv7a-linux": BuildInfo,
    @"i386-linux": BuildInfo,
    @"riscv64-linux": BuildInfo,
    @"x86_64-linux": BuildInfo,
    @"aarch64-macos": BuildInfo,
    @"x86_64-macos": BuildInfo,
    @"x86_64-windows": BuildInfo,
    @"aarch64-windows": BuildInfo,
};

const @"0_10_1" = struct {
    date: []const u8,
    docs: []const u8,
    stdDocs: []const u8,
    notes: []const u8,
    src: BuildInfo,
    bootstrap: BuildInfo,
    @"x86_64-macos": BuildInfo,
    @"aarch64-macos": BuildInfo,
    @"x86_64-linux": BuildInfo,
    @"aarch64-linux": BuildInfo,
    @"riscv64-linux": BuildInfo,
    @"i386-linux": BuildInfo,
    @"x86_64-windows": BuildInfo,
    @"aarch64-windows": BuildInfo,
};

const @"0_11_0" = struct {
    date: []const u8,
    docs: []const u8,
    stdDocs: []const u8,
    notes: []const u8,
    src: BuildInfo,
    bootstrap: BuildInfo,
    @"x86_64-freebsd": BuildInfo,
    @"x86_64-macos": BuildInfo,
    @"aarch64-macos": BuildInfo,
    @"x86_64-linux": BuildInfo,
    @"aarch64-linux": BuildInfo,
    @"armv7a-linux": BuildInfo,
    @"riscv64-linux": BuildInfo,
    @"powerpc64le-linux": BuildInfo,
    @"powerpc-linux": BuildInfo,
    @"x86-linux": BuildInfo,
    @"x86_64-windows": BuildInfo,
    @"aarch64-windows": BuildInfo,
    @"x86-windows": BuildInfo,
};

const BuildInfo = struct {
    tarball: []const u8,
    shasum: []const u8,
    size: []const u8,
};

ZIG版本:0.12.0-dev.1637+673a1efa2

推荐答案

try 将该JSON文件定义为 struct 可能不是最好的主意.当文件更改时,您计划做些什么?您最好使用动态解析(参见std/json/dynamic_test.zig).

总之,你的错误是:

  • 版本不使用_,而是.,所以应该是@"0.1.1": @"0_1_1"而不是@"0_1_1": @"0_1_1".
  • 0.7.0版没有armv6kz-linux.
  • 0.10.0版没有i386-windows.

Json相关问答推荐

Jolt转换问题—使用键查找匹配对象

在T—SQL中将STR_AGG与JSON_ARRAY结合起来

如何使用ChoETL将复杂的JSON转换为CSV

从先前的REST调用创建动态JSON主体

PowerShell:将Invoke-WebRequest与变量一起使用

当并非所有子对象都有 Select 器字段时 Select

如何对未知/变量键的字典进行编码?

APIM 生成 JsonArray 到 EventHub

如何按键过滤

父键中的 Perl JSON 数组

如何在linux中用jq过滤json数组?

将哈希表转换为 json 后,Powershell 缺少数组

Flask 请求和 application/json 内容类型

验证和格式化 JSON 文件

数据包含连续问号时无法理解的 jQuery $.ajax() 行为

如何向(JSON)对象的原型添加方法?

将 javascript 对象或数组转换为 json 以获取 ajax 数据

Python 到 JSON 序列化在十进制上失败

Protocol Buffer vs Json - 何时 Select 一个而不是另一个

如何从 BindingResult 获取控制器中的错误文本