
在 go 中无法直接拼接字符串与变量,需借助 fmt.sprintf 或 json.marshal 等机制生成合法 json;推荐使用 encoding/json 库序列化结构体,避免手动拼接引发的格式错误、转义漏洞或类型不匹配问题。
在 go 中无法直接拼接字符串与变量,需借助 fmt.sprintf 或 json.marshal 等机制生成合法 json;推荐使用 encoding/json 库序列化结构体,避免手动拼接引发的格式错误、转义漏洞或类型不匹配问题。
Go 语言不支持类似 JavaScript 或 Python 的字符串插值(如 "Test${id}"),因此不能在原始字符串字面量中直接嵌入 Result.SummaryID 或 Result.Description 变量。若强行用 + 拼接(如 "Test" + Result.SummaryID),不仅语法报错(类型不匹配:string + int),更会因缺乏 JSON 转义、引号包裹和类型校验,导致生成非法 JSON,极易引发 API 请求失败或安全风险(如注入)。
✅ 推荐方案:使用 encoding/json 安全序列化
最健壮、可维护的方式是定义清晰的嵌套结构体,并通过 json.MarshalIndent 生成格式化 JSON:
type Result struct {
SummaryID int `json:"summaryid"` // 注意字段名与 JSON key 一致
Description string `json:"description"`
}
// 封装完整请求体结构
type JiraFields struct {
Project map[string]string `json:"project"`
Summary string `json:"summary"`
Description string `json:"description"`
IssueType map[string]string `json:"issuetype"`
}
type JiraRequest struct {
Fields JiraFields `json:"fields"`
}
// 构建并序列化
result := Result{SummaryID: 123, Description: "Critical bug in auth flow"}
req := JiraRequest{
Fields: JiraFields{
Project: map[string]string{"key": "DC"},
Summary: "Test" + strconv.Itoa(result.SummaryID), // 显式转换,但建议用模板或结构体字段控制
Description: result.Description,
IssueType: map[string]string{"name": "Bug"},
},
}
byt, err := json.MarshalIndent(req, "", " ")
if err != nil {
log.Fatal("JSON marshal failed:", err)
}
// byt 是合法、已转义、格式化的 []byte? 提示:
json.MarshalIndent自动处理字符串转义(如Description中含",\n,中文等)、数字/布尔类型序列化、空值省略等,无需手动干预。
⚠️ 备选方案:仅限简单场景 —— fmt.Sprintf(慎用)
若因特殊限制必须字符串拼接,请确保:
- 所有动态值经
strconv或fmt显式转换; - 字符串内容经
json.Marshal预转义(防止 XSS 或解析失败); - 严格验证 JSON 结构合法性(建议加单元测试)。
// 不推荐,但可临时使用(务必转义 description!)
escapedDesc, _ := json.Marshal(result.Description) // 返回带引号的 JSON 字符串:`"value"`
byt := []byte(fmt.Sprintf(`
{
"fields": {
"project": {"key": "DC"},
"summary": "Test%d",
"description": %s,
"issuetype": {"name": "Bug"}
}
}`, result.SummaryID, escapedDesc))❌ 绝对避免的行为
- 直接
"Test" + result.SummaryID(类型错误); - 未转义用户输入(如
result.Description含"或\会导致 JSON 解析失败); - 忽略字段名大小写或 JSON tag 不匹配(如结构体字段
SummaryID对应 JSON key 应为"summaryid",而非"summary")。
总结
✅ 首选 encoding/json:类型安全、自动转义、易测试、符合 Go 工程实践;
? 结构体设计优先:比 map[string]interface{} 更具可读性与编译期检查能力;
? 远离裸字符串拼接:它看似简单,实则埋下稳定性与安全性的双重隐患。


















