小到配置文件、中等规模数据文件(100MB)用os.ReadFile+json.Unmarshal最简;超大文件或需流式解析时用json.NewDecoder;动态键名优先map[string]interface{};字段必须首字母大写并加json标签。

Golang如何读取JSON文件_Golang JSON文件解析技巧

os.ReadFile + json.Unmarshal 是最简方案

小到配置文件、中等规模的数据文件(<10MB),直接读字节再解码是最自然、最不容易出错的方式。Go 1.16+ 推荐用 os.ReadFile,它一步到位返回 []byte,避免手动开文件、defer、错误传播的样板代码。

data, err := os.ReadFile("config.json")
if err != nil {
    log.Fatal(err)
}
var cfg struct {
    DBHost string `json:"db_host"`
    DBPort int    `json:"db_port"`
}
if err := json.Unmarshal(data, &cfg); err != nil {
    log.Fatal("parse error:", err)
}

嵌套字段缺失?用指针或 json.RawMessage 区分“空”和“不存在”

JSON 中某个对象字段可能压根没出现({"user":{...}}),也可能显式为 null{"user":null}),还可能为空对象({"user":{}})。如果结构体字段是非指针类型(如 User User),这三种情况在 Go 里都会变成零值结构体,业务逻辑无法区分。

大文件(>100MB)或流式场景?换 json.NewDecoder

当 JSON 文件体积很大,或者你只想解析其中一部分(比如一个巨型数组里的每个元素),json.Unmarshal 会把整个文件加载进内存,容易触发 OOM。

f, _ := os.Open("huge.json")
decoder := json.NewDecoder(f)
var item MyItem
for decoder.Decode(&item) == nil {
    // 处理每个 item
}

动态键名或结构不确定?优先选 map[string]interface{},不是 interface{}

当你不知道 JSON 的 key 名(比如监控指标带时间戳前缀),或字段类型混杂("value" 有时是数字、有时是字符串),硬写结构体会很痛苦。

最容易被忽略的其实是字段导出规则和标签一致性——90% 的“解析不出来”问题,根源都在结构体字段小写了,或者漏了 json:"xxx"。别猜,打开文件用 jq . 看一眼原始结构,再对齐写结构体,比反复试错快得多。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。