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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:52:55