Go构造HTTP POST请求JSON值时出现JSON无效错误如何解决
错误原因
- 手动拼接JSON存在格式隐患:如果variable1、variable2是字符串类型,你没有给它们包裹双引号,拼接后会出现
"variable1": xxx的非法JSON格式;如果变量值包含双引号、转义字符、换行等特殊字符,会直接破坏整个JSON结构。 - 变量名匹配错误:你定义的JSON字符串变量是
dataString,但传给http.NewRequest的请求体是finalDataString,两者不是同一个变量,导致实际提交的内容根本不是你构造的JSON,自然格式无效。
正确实现方案
不要手动拼接JSON,直接使用Go标准库encoding/json做序列化,自动处理所有格式转义问题,示例代码:
import "encoding/json" // 先定义和JSON字段匹配的结构体 type PostData struct { CredentialsID string `json:"credentials_id"` UserID string `json:"user_id"` Variable1 string `json:"variable1"` // 变量类型可根据实际需求调整为int等其他类型 Variable2 string `json:"variable2"` } // 实例化结构体赋值 data := PostData{ CredentialsID: "12345", UserID: "12", Variable1: variable1, Variable2: variable2, } // 序列化得到合法JSON字节数组 jsonData, err := json.Marshal(data) if err != nil { log.Printf("JSON序列化失败: %v", err) os.Exit(1) } // 构造请求时直接传jsonData req, err = http.NewRequest("POST", "https://api-call-url/bla", bytes.NewReader(jsonData)) // 后续请求头设置、请求执行逻辑保持不变即可
验证小技巧
如果还是遇到JSON格式问题,可以把构造的请求体内容打印出来,粘贴到JSON校验工具里检查具体错误位置,快速定位问题。
内容的提问来源于stack exchange,提问作者Jon Nicholson
相关产品推荐
相关产品推荐

