求助:如何将JSON文件中的数组读取到Go语言切片中
解决Go语言解析JSON文件并赋值到切片的问题
你之前的方向完全错了:os.Open返回的是文件句柄,不是解析后的JSON数据,所以没法直接用jsonFile["cars"]这种方式访问内容。必须用Go标准库的encoding/json包来解析文件里的JSON内容,以下是完整的解决方案:
1. 定义对应JSON结构的类型
你的JSON包含三个字符串数组,推荐用结构体来对应(比直接用map更规范,类型安全):
type Inventory struct { Mobiles []string `json:"mobiles"` // json标签对应JSON里的小写键 Laptops []string `json:"laptops"` Cars []string `json:"cars"` }
注意:结构体字段名首字母必须大写(Go的可见性规则,确保JSON包能访问),json:"xxx"标签用来匹配JSON中的小写键名。
2. 解析JSON到切片的完整代码
直接用json.NewDecoder从文件句柄解码,效率更高:
package main import ( "encoding/json" "fmt" "os" ) type Inventory struct { Mobiles []string `json:"mobiles"` Laptops []string `json:"laptops"` Cars []string `json:"cars"` } func main() { // 打开JSON文件 jsonFile, err := os.Open("data/data.json") if err != nil { fmt.Println("打开文件失败:", err) return } defer jsonFile.Close() // 记得关闭文件句柄,避免资源泄漏 // 定义结构体变量存储解析后的数据 var inv Inventory // 解码JSON内容到结构体 err = json.NewDecoder(jsonFile).Decode(&inv) if err != nil { fmt.Println("解析JSON失败:", err) return } // 将结构体中的数组赋值到目标切片 mobiles := inv.Mobiles laptops := inv.Laptops cars := inv.Cars // 测试输出 fmt.Println("手机列表:", mobiles) fmt.Println("笔记本列表:", laptops) fmt.Println("汽车列表:", cars) }
关于切片添加数据的问题
完全可以!Go的切片是动态扩容的,你可以用append函数随时添加元素,之后还能把更新后的数据写回JSON文件:
// 给手机列表添加新机型 mobiles = append(mobiles, "Samsung S23") // 同步更新结构体(如果要写回文件的话) inv.Mobiles = mobiles // 将更新后的数据写入JSON文件 outputFile, err := os.OpenFile("data/data.json", os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0644) if err != nil { fmt.Println("打开输出文件失败:", err) return } defer outputFile.Close() // 格式化输出JSON,更易读 encoder := json.NewEncoder(outputFile) encoder.SetIndent("", " ") err = encoder.Encode(inv) if err != nil { fmt.Println("写入JSON失败:", err) return } fmt.Println("数据已更新并写入文件")
关于指针的疑问
你现在不需要特意去啃指针,上面代码里的&inv只是把结构体的地址传给Decode函数——因为Decode需要修改结构体里的值,Go是值传递,必须传指针才能修改原变量。这属于JSON解析的常规操作,跟着示例写就行,等你对Go基础类型更熟悉后,自然会理解指针的作用。
内容的提问来源于stack exchange,提问作者Barry Marples
相关产品推荐
相关产品推荐

