YamlBox

代码生成器 · 5 分钟阅读

JSON 到 Go:第一次尝试时解组的结构

Go 让你写下你正在解码的 JSON 的形状,编译器会让你记住它。从实际响应到 JSON 到 Go 的转换消除了键入和猜测:字段名称、`json` 标签和嵌套类型都正确到达,并且您可以直接进入程序中实际执行某些操作的部分。

已更新

生成的形状

转换器将每个 JSON 对象转换为结构体,将每个数组转换为切片,并推断每个值的 Go 类型。嵌套对象变成命名类型而不是匿名 blob,这使解码代码的签名保持可读:

                type Container struct {
  Name  string `json:"name"`
  Image string `json:"image"`
  Ports []struct {
    ContainerPort int `json:"containerPort"`
  } `json:"ports"`
}
              

`json`标签是重要的部分。 Go 的解码器在匹配字段名称时不区分大小写,但 `containerPort` 和 `ContainerPort` 在没有标签的情况下不会对齐,并且任何不是有效 Go 标识符的键(例如 `app.kubernetes.io/name`)在没有标签的情况下根本无法匹配。

数字、空值和两个经典陷阱

  • 数字 — 对于整数值,推理会生成 `int`,但 JSON 没有整数类型。今天为 `3` 的字段明天可能为 `3.5`,因此根据您的需要,ID 和金钱为 `float64`、`string` 或 `json.Number` 更安全。
  • 空值 — 可以是 `null` 的键应该是指针 (`*string`),这样你就可以区分“不存在”和“空”。
  • 时间戳 — RFC 3339 字符串可以清晰地解码为 `time.Time`; Unix 纪元号则不然,因此将它们保留为 `int64` 并显式转换。
  • 未知字段 — 默认情况下`json.Decoder`忽略额外字段;当您宁愿大声失败时,请使用 `DisallowUnknownFields`。

尽可能从两个或三个响应中生成。有时缺失的字段会变成指针,根据证据比根据记忆做出决定要容易得多。

从结构到工作代码

结构就位后,解码只需三行,编译器会从那里强制执行访问路径。常见的模式是解码到生成的结构,然后映射到域类型,以便 JSON 形状可以更改,而不会影响应用程序。用生成的文件来自的端点标记生成的文件,并在响应更改时重新生成,而不是手动编辑它 - 手动编辑生成的代码是以后没人敢重新生成的版本。

本地生成

值得生成 Go 结构体的有效负载通常是真实的 API 响应,而真实的响应携带令牌和客户数据。基于浏览器的 JSON 到 Go 的转换将有效负载保留在选项卡中(无需上传,没有保留问题),这使得从生产数据生成成为正常步骤,而不是策略例外。

JSON 前往 — 常见问题

为什么我的 Go 结构体无法解码 JSON?

JSON 中的字段名称很少与 Go 的导出名称完全匹配,因此该结构体需要 `json` 标签。启用标签后重新生成,确认关键拼写(包括标点符号),并检查解码器是否应允许未知字段。

生成的数字字段应该是 int 还是 float64?

对于来自外部 API 的任何内容,请使用 `float64`(或当精度很重要时)`json.Number`,因为 JSON 不区分整数和小数。为您端到端控制的值保留 `int`。

如何处理有时为空的字段?

使其成为指针类型,例如`*string`,它对“键不存在”和“键存在空值”进行编码,同时仍然允许您检查真实值。非指针字段默默地变成零值。

这篇文章中提到的工具

浏览 19 工具的完整列表

更多文章可供阅读

所有19帖子→