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

Go语言解析公共API返回JSON数组无法正常取值问题求助

问题原因

你遇到的问题主要有三个核心错误:

  • JSON结构不匹配:第一个场景的API返回的是JSON数组(外层用[]包裹),但你声明的接收变量是单个TokenNamingInfo结构体,和数组结构完全不匹配。你第二个场景可以正常运行,就是因为对应返回的是单个JSON对象,外层没有[],和你声明的单个结构体类型匹配。
  • 反序列化参数错误:调用json.Unmarshal时第一个参数传入的是未定义的tokensymbol变量,没有使用实际的接口响应流respmeta.Body;同时第二个参数取地址的responseTokenPrice是不存在的变量,和你声明的responseTokenSymbol变量名完全不一致。
  • 字段访问错误:Go的json包只能识别首字母大写的导出字段,你打印时写的.name是小写,和结构体定义的TokenName字段名不符,根本访问不到对应值。
解决方法

修正后的代码如下:

type TokenNamingInfo struct {
    TokenName    string `json:"name"`
    TokenAddress string `json:"address"`
    TokenSymbol  string `json:"symbol"`
}

reqmeta, err := http.NewRequest("GET", "https://somesite.com", nil)
if err != nil {
    // 处理请求初始化错误
    return
}
reqmeta.Header.Set("Accept", "application/json")
reqmeta.Header.Set("X-Api-Key", "api")

respmeta, err := http.DefaultClient.Do(reqmeta)
if err != nil {
    // 处理请求执行错误
    return
}
defer respmeta.Body.Close()

// 声明切片类型接收数组格式的JSON
var responseTokenSymbol []TokenNamingInfo
// 直接从响应流解码JSON,同时捕获错误
err = json.NewDecoder(respmeta.Body).Decode(&responseTokenSymbol)
if err != nil {
    // 处理反序列化错误
    return
}

// 先判断切片非空避免越界,再访问正确的字段名
if len(responseTokenSymbol) > 0 {
    fmt.Println(responseTokenSymbol[0].TokenName)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 12:06:03