如何正确解析 CoinMarketCap API 返回的 JSON 数组

冬浩君_6733

冬浩君_6733

2026-07-31

622人浏览

原创

如何正确解析 CoinMarketCap API 返回的 JSON 数组

本文详解 go 语言中解析嵌套于 json 数组中的 api 响应(如 coinmarketcap v1 接口),重点解决因结构体类型与 json 根节点不匹配导致的解析失败问题,并提供健壮的错误处理与类型适配方案。

本文详解 go 语言中解析嵌套于 json 数组中的 api 响应(如 coinmarketcap v1 接口),重点解决因结构体类型与 json 根节点不匹配导致的解析失败问题,并提供健壮的错误处理与类型适配方案。

在 Go 中调用 RESTful API 并解析 JSON 响应时,一个常见却容易被忽略的关键点是:JSON 响应的顶层结构必须与 Go 结构体变量的类型严格匹配。以 https://api.coinmarketcap.com/v1/ticker/ethereum 为例,其响应是一个包含单个对象的 JSON 数组(即 [ {...} ]),而非直接的对象({...})。若仍使用 new(CoinMarketCapData) 创建单个结构体实例并传入 json.Decode(),解码器将无法匹配数组起始符 [,最终静默失败——字段保持零值(如空字符串、0、0.0),且不报错(除非显式检查返回的 error)。

正确做法是:将目标变量声明为切片(slice),并传入其地址。因为 json.Decoder.Decode() 要求传入一个可修改的指针,而切片本身是引用类型,需用 &priceData 确保解码器能向底层数组写入数据。

以下是修正后的完整示例:

Aria2 Json Rpc
Aria2 Json Rpc

通过 JSON‑RPC 2.0 与 aria2 下载管理器交互,使用自然语言命令管理下载、查询状态并控制任务。适用于 aria2、下载管理或种子操作。

下载
package main

import (
    "encoding/json"
    "net/http"
    "log"
)

type CoinMarketCapData struct {
    Id               string  `json:"id"`
    Name             string  `json:"name"`
    Symbol           string  `json:"symbol"`
    Rank             int     `json:"rank"`
    PriceUSD         float64 `json:"price_usd"`
    PriceBTC         float64 `json:"price_btc"`
    Volume24hUSD     float64 `json:"24h_volume_usd"`
    MarketCapUSD     float64 `json:"market_cap_usd"`
    AvailableSupply  float64 `json:"available_supply"`
    TotalSupply      float64 `json:"total_supply"`
    PercentChange1h  float32 `json:"percent_change_1h"`
    PercentChange24h float32 `json:"percent_change_24h"`
    PercentChange7d  float32 `json:"percent_change_7d"`
}

func getJson(url string, target interface{}) error {
    client := &http.Client{}
    req, err := http.NewRequest("GET", url, nil)
    if err != nil {
        return err
    }
    req.Header.Set("Accept", "application/json") // 更准确:用 Accept 而非 Content-Type
    r, err := client.Do(req)
    if err != nil {
        return err
    }
    defer r.Body.Close()
    return json.NewDecoder(r.Body).Decode(target)
}

func main() {
    url := "https://api.coinmarketcap.com/v1/ticker/ethereum"
    priceData := make([]CoinMarketCapData, 0) // 初始化为空切片
    err := getJson(url, &priceData)            // 关键:传 &slice
    if err != nil {
        log.Fatalf("HTTP 或 JSON 解析失败: %v", err)
    }
    if len(priceData) == 0 {
        log.Fatal("API 响应为空数组")
    }
    log.Printf("Ethereum Id: %s, Name: %s, Price (USD): $%.2f", 
        priceData[0].Id, priceData[0].Name, priceData[0].PriceUSD)
}

⚠️ 关键注意事项:

  • 结构体字段标签(struct tags)必不可少:CoinMarketCap 的字段名含下划线(如 price_usd),Go 默认按首字母大写导出字段名匹配,因此必须通过 `json:"price_usd"` 显式映射。
  • 始终检查 getJson 返回的 error:网络请求或 JSON 语法错误均会在此处暴露,忽略它将导致调试困难。
  • 避免 http.NewRequest 中的 _ 忽略错误:应显式处理创建请求失败的情况(如 URL 格式错误)。
  • Content-Type 请求头不适用于 GET:应改为设置 Accept: application/json,表明客户端期望 JSON 响应。
  • API 已弃用提示:api.coinmarketcap.com/v1 已于 2018 年停用,生产环境请迁移至 v2 API 并使用 API Key 认证;本例仅作技术原理演示。

总结:解析 JSON 的核心原则是「结构一致」——数组响应 → 切片变量 + 取地址;对象响应 → 结构体指针。结合字段标签、错误检查与规范 HTTP 头,即可稳健处理各类第三方 API 数据。

大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

2023.06.20

3956

8

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.28

1255

5

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.03

1598

5

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

2023.08.17

9443

11

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

2023.09.01

880

4

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

2384

5

Js中concat和push的区别
Js中concat和push的区别

Js中concat和push的区别:1、concat用于将两个或多个数组合并成一个新数组,并返回这个新数组,而push用于向数组的末尾添加一个或多个元素,并返回修改后的数组的新长度;2、concat不会修改原始数组,是创建新的数组,而push会修改原数组,将新元素添加到原数组的末尾等等。本专题为大家提供concat和push相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.14

1469

5

js截取字符串的方法介绍
js截取字符串的方法介绍

JavaScript字符串截取方法,包括substring、slice、substr、charAt和split方法。这些方法可以根据具体需求,灵活地截取字符串的不同部分。在实际开发中,根据具体情况选择合适的方法进行字符串截取,能够提高代码的效率和可读性 。

2023.09.21

4029

3

js生成随机数方法
js生成随机数方法

JavaScript生成随机数的方法,包括使用Math.random()方法生成指定范围内的随机整数、生成随机字符串和生成随机颜色。根据具体需求,可以选择适合的方法来生成随机数,以实现各种功能 。

2023.09.25

2275

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程