Go语言:拼接数组为字符串时保留引号的JSON模板替换问题
解决Go中JSON模板字符串替换数组时引号转义的问题
你的问题出在%q的使用上——这个格式化符号会把整个输入的字符串当成单个值包裹引号,还会自动转义字符串内部的双引号,所以才出现了"prod\","stats"这种带转义符的结果。下面给你两种可行的解决办法:
方法1:直接拼接正确的数组元素(简单场景适用)
去掉%q,直接用strings.Join把数组元素用","连接后放到模板的数组括号里就可以了,因为Join已经帮你处理好元素间的引号逻辑:
package main import ( "fmt" "strings" ) func main() { tags := []string{"prod", "stats"} jsonStr := []byte(fmt.Sprintf(`{"isRegion":true, "tags":[%s]}`, strings.Join(tags, `","`))) fmt.Println(string(jsonStr)) // 输出:{"isRegion":true, "tags":["prod","stats"]} }
方法2:用结构体序列化(推荐,复杂场景更安全)
手动拼接JSON很容易踩坑(比如特殊字符转义、语法错误),Go官方更推荐用结构体结合json.Marshal来生成JSON,这种方式会自动处理所有格式问题:
package main import ( "encoding/json" "fmt" ) type RegionConfig struct { IsRegion bool `json:"isRegion"` Tags []string `json:"tags"` } func main() { config := RegionConfig{ IsRegion: true, Tags: []string{"prod", "stats"}, } jsonStr, err := json.Marshal(config) if err != nil { panic(err) } fmt.Println(string(jsonStr)) // 输出:{"isRegion":true,"tags":["prod","stats"]} }
为什么原来的代码会出问题?
你原来的代码里,%q会把strings.Join(tags, ",")返回的prod","stats整个当成一个字符串,给它加上外层引号,同时把内部的双引号转义成\",所以最终得到的是"prod\","stats",这就和你想要的数组元素格式不符了。
内容的提问来源于stack exchange,提问作者MrDuk
相关产品推荐
相关产品推荐

