Go语言使用fmt.Sprintf构建POST请求JSON体是否存在格式错误?
结论
你使用fmt.Sprintf手动拼接JSON请求体的方式存在不可忽视的错误风险,属于不规范的实现方式。
问题说明
- 你当前观察到的缩进、换行差异其实对标准JSON解析器没有影响,空白字符不会改变JSON的语义,你输出的内容本身是语法合法的JSON,仅排版和目标预期不一致。
- 手动拼接JSON的核心风险在于特殊字符转义处理:如果
relativeurl变量中包含双引号、反斜杠、换行符等JSON需转义的特殊字符,拼接生成的JSON会直接出现语法错误,导致接口侧解析失败。
推荐实现方案
优先使用Go标准库encoding/json序列化结构体生成JSON,自动处理转义、格式问题,示例代码如下:
package main import ( "encoding/json" "fmt" ) // 定义和JSON结构对应的结构体 type RequestItem struct { HttpMethod string `json:"httpMethod"` RelativeUrl string `json:"relativeUrl"` } type PostPayload struct { Requests []RequestItem `json:"requests"` } func main() { relativeUrl := "this-is-a-test-url" // 填充结构体数据 payload := PostPayload{ Requests: []RequestItem{ { HttpMethod: "GET", RelativeUrl: relativeUrl, }, }, } // MarshalIndent 第二个参数是前缀,第三个参数是缩进字符,这里用4个空格匹配你需要的格式 jsonData, err := json.MarshalIndent(payload, "", " ") if err != nil { // 实际场景替换为你的错误处理逻辑 panic(err) } fmt.Println(string(jsonData)) }
运行上述代码输出的JSON格式和你预期的目标格式完全一致,且能自动处理所有特殊字符的转义问题,稳定性远高于手动拼接。
内容的提问来源于stack exchange,提问作者Sajeesh Krishnan
相关产品推荐
相关产品推荐

