
Go 的 encoding/json 包默认会对 <、> 和 & 进行 Unicode 转义(如 \u0026),以防止 XSS 风险;若需保留原始字符(如生成前端可直接使用的 JSON),可通过 json.Encoder.SetEscapeHTML(false) 禁用该行为。
go 的 `encoding/json` 包默认会对 `` 和 `&` 进行 unicode 转义(如 `\u0026`),以防止 xss 风险;若需保留原始字符(如生成前端可直接使用的 json),可通过 `json.encoder.setescapehtml(false)` 禁用该行为。
在 Go 中,json.Marshal() 和 json.Encoder 默认启用 HTML 安全转义(SetEscapeHTML(true)),将 <、> 和 & 分别编码为 \u003c、\u003e 和 \u0026。这虽提升了嵌入 HTML 场景的安全性,但在纯 API 交互或需要保持字符串可读性的场景下反而造成干扰。
推荐方案:使用 json.Encoder 并关闭 HTML 转义
自 Go 1.7 起,json.Encoder 提供了 SetEscapeHTML(false) 方法,可安全禁用该机制:
package main
import (
"bytes"
"encoding/json"
"fmt"
)
func main() {
mp := map[string]string{"key": "The Knight & Day <test>"}
var buf bytes.Buffer
enc := json.NewEncoder(&buf)
enc.SetEscapeHTML(false) // ✅ 关键:禁用 HTML 转义
err := enc.Encode(mp)
if err != nil {
panic(err)
}
fmt.Println(buf.String())
// 输出: {"key":"The Knight & Day <test>"}
}⚠️ 注意事项:
anything-to-html下载将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
- json.Marshal() 不提供禁用转义的选项,仅 json.Encoder 支持 SetEscapeHTML();
- SetEscapeHTML(false) 仅影响 <、>、& 三个字符,其他 Unicode 字符(如中文、emoji)仍按标准 JSON 规范正常编码;
- 若必须使用 json.Marshal(),可手动后处理(如 bytes.ReplaceAll()),但属临时规避,易出错且不推荐:
b, _ := json.Marshal(mp) b = bytes.ReplaceAll(b, []byte(`\u003c`), []byte("<")) b = bytes.ReplaceAll(b, []byte(`\u003e`), []byte(">")) b = bytes.ReplaceAll(b, []byte(`\u0026`), []byte("&"))- 禁用转义后,请确保 JSON 输出不被直接内联到 HTML 的未加引号属性或 script 标签中,否则可能引入 XSS 漏洞——建议始终通过 textContent 或 JSON.parse() 在前端消费 JSON。
综上,enc.SetEscapeHTML(false) 是最简洁、安全且符合 Go 最佳实践的解决方案,适用于 API 响应、配置序列化等无需 HTML 上下文的场景。



















