You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Golang如何逐段读取解析key:value结构的大型JSON文件

Go大体积对象型JSON流式解析方案

直接使用Go标准库encoding/json内置的流式解析器json.Decoder即可实现分段读取,全程不会将全量文件加载到内存,内存占用仅和单次处理的单个嵌套对象大小相关。

实现逻辑

利用json.Decoder的逐Token读取能力,跳过全量对象反序列化步骤,只按需读取外层键值对,每次仅解码单个键对应的嵌套对象进行业务处理,处理完成后对象自动回收释放内存。

示例代码

package main

import (
	"encoding/json"
	"os"
)

// 替换为你实际业务中嵌套对象对应的结构体
type NestedItem struct {
	NestedKey1 string `json:"nestedKey1"`
	NestedKey2 string `json:"nestedKey2"`
}

func main() {
	// 仅打开文件句柄,不加载全量内容
	file, err := os.Open("your_large_file.json")
	if err != nil {
		panic(err)
	}
	defer file.Close()

	decoder := json.NewDecoder(file)

	// 读取外层对象起始标记 {
	if _, err = decoder.Token(); err != nil {
		panic(err)
	}

	// 遍历外层所有键值对
	for decoder.More() {
		// 读取外层键名
		rawKey, err := decoder.Token()
		if err != nil {
			panic(err)
		}
		key := rawKey.(string)

		// 仅解码当前键对应的嵌套对象
		var item NestedItem
		if err = decoder.Decode(&item); err != nil {
			panic(err)
		}

		// 此处编写你的业务处理逻辑,处理完item即释放内存
		_ = key
		_ = item
	}

	// 读取外层对象结束标记 }
	if _, err = decoder.Token(); err != nil {
		panic(err)
	}
}

优化说明

  • 若单个嵌套对象本身也超过内存限制,可对嵌套对象继续使用逐Token读取的逻辑分层解析,无需一次性解码完整嵌套结构
  • 若需要更高的解析性能,可替换标准库json.Decoder为同API兼容的高性能JSON解析库,代码改造量极小
  • 不需要留存的键值可直接丢弃,无需存储,进一步降低内存占用

内容的提问来源于stack exchange,提问作者Neeecu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 02:27:02