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

求助:如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 02:50:40