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
相关产品推荐
相关产品推荐

