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

Go语言JSON解析报错求助:无法将字符串解析为map[string]interface{}

排查Go JSON反序列化错误:"json: cannot unmarshal string into Go value of type map[string]interface {}"

这种JSON反序列化的坑我太熟了——明明手动操作一切正常,代码跑起来就炸,简直让人挠头!咱们一步步来定位问题:

  • 先抓包对比响应内容
    别光信手动调用的结果,先把代码里请求到的原始响应打出来看看。很多时候是代码请求的参数、请求头和手动操作不一致,导致钱包返回的不是你预期的JSON对象,而是一个字符串(比如错误提示、空响应或者格式不对的内容)。
    可以在代码里加一段打印原始响应的逻辑:

    resp, err := httpClient.Do(req)
    if err != nil {
        log.Fatal(err)
    }
    defer resp.Body.Close()
    
    // 打印原始响应内容
    rawBody, _ := io.ReadAll(resp.Body)
    fmt.Printf("Raw API Response: %q\n", string(rawBody))
    
    // 重新读取body(因为ReadAll会把body读空)
    resp.Body = io.NopCloser(bytes.NewBuffer(rawBody))
    // 再执行你的反序列化逻辑
    

    把这段输出和你手动调用钱包API得到的响应对比,大概率能发现差异——比如代码里漏传了某个必填参数,返回了"invalid request"这样的字符串,自然没法转成map[string]interface{}。

  • 检查JSON解析的分支处理
    有些钱包API的返回逻辑不统一:成功时返回JSON对象,失败时直接返回字符串提示。你的代码可能只处理了成功的情况,没考虑失败分支。比如手动操作时你用了正确的参数,返回的是对象;但代码里可能因为某些逻辑错误(比如地址格式不对),触发了API的错误返回,导致拿到的是字符串。

  • 排查响应编码或特殊字符
    偶尔会遇到响应带BOM头(比如UTF-8 BOM)或者隐藏的特殊字符,这些在手动查看时可能看不到,但会让Go的JSON解析器把整个响应当成一个字符串。你可以打印rawBody的字节切片,看看开头是不是有\xef\xbb\xbf这类BOM字节,如果有的话,需要先去除再解析。

  • 核对请求头的一致性
    手动调用时(比如用Postman或浏览器),工具会自动添加一些请求头(比如Content-Type: application/json),但代码里可能没设置,导致钱包API返回的是文本格式而非JSON对象。检查下你的请求头,确保和手动调用时一致。

先从打印原始响应开始吧,这是最快定位问题的方法——很多时候你会发现代码拿到的响应和预期完全不一样!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:47:36