Go语言JSON解析报错求助:无法将字符串解析为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

