代码生成器 · 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`,它对“键不存在”和“键存在空值”进行编码,同时仍然允许您检查真实值。非指针字段默默地变成零值。
这篇文章中提到的工具
更多文章可供阅读
6 分钟阅读
JSON至TypeScript:符合实际的类型
将真实 API 响应(可选键、空联合、嵌套类型)的 JSON 接口转换为 TypeScript 接口,并防止生成的类型发生漂移。
5 分钟阅读
JSON 到 SQL:从有效负载到可查询的表
使用从真实有效负载生成的 CREATE TABLE 和 INSERT 语句,通过合理的类型映射、转义和诚实限制,将 JSON 转换为 SQL。
6 分钟阅读
JSON 格式化程序:漂亮、精简且有效
一个 JSON 格式化程序,可以漂亮地打印、缩小并验证准确的错误位置 - 加上几乎每个无效 JSON 错误背后的五个语法错误。
- 较长的文章可供阅读: JSON 至 TypeScript:说实话的类型