Gin 如何用 PureJSON 输出字面量 HTML 特殊字符而不是 JSON 默认转义

发布时间:2026/11/8 19:39:23

Gin 如何用 PureJSON 输出字面量 HTML 特殊字符而不是 JSON 默认转义 Gin 如何用 PureJSON 输出字面量 HTML 特殊字符而不是 JSON 默认转义【免费下载链接】ginGin is a high-performance HTTP web framework written in Go. It provides a Martini-like API but with significantly better performance—up to 40 times faster—thanks to httprouter. Gin is designed for building REST APIs, web applications, and microservices.项目地址: https://gitcode.com/GitHub_Trending/gi/gin当你用 Gin 的c.JSON返回包含、、的字符串时响应体里看到的全是\u003c、\u003e、\u0026这类 Unicode 转义前端拿到后需要再还原一次。如果你的接口直接面向 JSON 消费者而不是把 JSON 嵌进 HTML 里这些转义只会干扰可读性。Gin 提供c.PureJSON来解决这个问题它在序列化前关闭 HTML 转义让特殊字符以字面量形式输出。本文基于本仓库的 docs/doc.md 中 PureJSON 章节、渲染器实现与测试断言给出一条可运行、可核对的最小操作路径。当前仓库 go.mod 声明go 1.25.0文档中提到的 Go 1.6 限制见下文对当前版本自然满足。为什么c.JSON会把 HTML 特殊字符转义先明确默认行为是什么。Gin 的 JSON 编码器接口对SetEscapeHTML的注释写得很清楚codec/json/api.go默认行为是把、、转义为\u0026、\u003c、\u003e以避免把 JSON 嵌入 HTML 时可能引发的安全问题在转义影响可读性的非 HTML 场景下调用SetEscapeHTML(false)关闭这一行为。c.JSON走的是Marshal路径保留默认转义。仓库测试 context_test.go 里的TestContextRenderJSON就是这条默认行为的断言输入H{foo: bar, html: b}期望响应体为{foo:bar,html:\u003cb\u003e}Content-Type为application/json; charsetutf-8。这就是你遇到字面量变转义现象的直接来源。PureJSON 的实现路径c.PureJSON在 context.go 中定义为// PureJSON serializes the given struct as JSON into the response body. // PureJSON, unlike JSON, does not replace special html characters with their unicode entities. func (c *Context) PureJSON(code int, obj any) { c.Render(code, render.PureJSON{Data: obj}) }而渲染器 render/json.go 的PureJSON.Render做三件事写入Content-Type: application/json; charsetutf-8通过当前 JSON codec 创建Encoder调用encoder.SetEscapeHTML(false)调用encoder.Encode(r.Data)。注意Encode与Marshal不同它会在 JSON 编码后追加一个换行符codec/json/api.go 的注释。所以PureJSON的响应体比c.JSON多一个结尾换行仓库测试 render_test.go 的期望值{foo:bar,html:b}后正是带\n的。写一个最小示例并核对输出下面这个程序直接取自 docs/doc.md 的 PureJSON 章节同时挂上/json和/purejson两条路由方便对比转义前后的差异。保存为独立目录中的main.gogo mod initgo get github.com/gin-gonic/gin然后运行package main import ( net/http github.com/gin-gonic/gin ) func main() { r : gin.Default() // Serves unicode entities r.GET(/json, func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ html: bHello, world!/b, }) }) // Serves literal characters r.GET(/purejson, func(c *gin.Context) { c.PureJSON(http.StatusOK, gin.H{ html: bHello, world!/b, }) }) // listen and serve on 0.0.0.0:8080 r.Run(:8080) }go run .启动后分别请求两条路由curl http://localhost:8080/json curl http://localhost:8080/purejson判断标准以仓库测试断言为准c.JSON对html: b的期望输出是转义形式\u003cb\u003econtext_test.goc.PureJSON的期望输出是字面量b且Content-Type为application/json; charsetutf-8context_test.go 的TestContextRenderPureJSON。如果/json返回\u003c...\u003e而/purejson返回...说明行为与文档一致。需要中断响应链时AbortWithStatusPureJSON如果你的场景是中间件里校验失败后要中断链 返回未转义 JSON可以用AbortWithStatusPureJSON。context.go 中的注释说明它先调用Abort()再内部调用PureJSON停止处理链、写入状态码并返回不带转义的 JSON body同时把Content-Type设为application/json。对应测试 TestContextAbortWithStatusPureJSON 断言了响应体未被转义{foo:fooValue,bar:barValue}形式的明文输出且上下文处于 aborted 状态。可选分支替换 JSON codec 时 PureJSON 是否仍生效Gin 默认用encoding/json也可以按 docs/doc.md 的 Build Tags 章节在构建时替换 codecgo build -tagsjsoniter . # 或 go build -tagsgo_json . # 或 go build -tagssonic .PureJSON.Render不是直接调用encoding/json而是走 codec 抽象的json.API.NewEncoder(w)再SetEscapeHTML(false)见上文 render/json.go。各 codec 实现如 codec/json/jsoniter.go 使用jsoniter.ConfigCompatibleWithStandardLibrary都返回实现了同一Encoder接口的对象该接口的SetEscapeHTML语义在 codec/json/api.go 中统一注明。因此按上述 build tag 替换 codec 构建时PureJSON的关闭转义逻辑仍然走同一接口路径。限制与核对清单文档明确说明This feature is unavailable in Go 1.6 and lower即 PureJSON 需要 Go 1.6 以上当前仓库要求 Go 1.25.0go.mod正常拉取构建即可满足。PureJSON输出带一个结尾换行符Encode行为这是与c.JSON输出的已知差异来自 codec/json/api.go 的注释与 render_test.go 的断言。两种渲染器Content-Type都是application/json; charsetutf-8区别只在是否转义不要依赖Content-Type来区分二者。不依赖跑服务也可以核对在本仓库根目录执行go test -run TestRenderPureJSON ./render/和go test -run TestContextRenderPureJSON .两条测试分别对应渲染器与Context层的字面量输出断言。如果你发现/purejson的输出仍被转义先确认代码路径确实改成了c.PureJSON而不是c.JSON文档中AbortWithStatusPureJSON注释里 return a JSON body without escaping 的描述表明未转义行为是纯PureJSON渲染路径的预期而非配置项可切换的选项。【免费下载链接】ginGin is a high-performance HTTP web framework written in Go. It provides a Martini-like API but with significantly better performance—up to 40 times faster—thanks to httprouter. Gin is designed for building REST APIs, web applications, and microservices.项目地址: https://gitcode.com/GitHub_Trending/gi/gin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/11/8 19:39:22

528.按权重随机选择(前缀和二分法)加权负载均衡

链接&#xff1a;528. 按权重随机选择 - 力扣&#xff08;LeetCode&#xff09; 题解&#xff1a; 1、把权重累加&#xff0c;构建前缀和数组 2、random()%权重sum 3、二分查找&#xff0c;在前缀和数组 class Solution { public:Solution(vector<int>& w) {if …

2026/11/7 9:41:02

基于 GB/T 3836 标准的油气站防爆对讲机选型与通信安全方案

文章定位&#xff1a;技术方案类&#xff0c;面向油气站安全管理人员、通信运维人员&#xff0c;梳理油气站防爆通信的标准要求、设备选型要点、组网方案、施工验收与运维保障。 核心内容&#xff1a;防爆标准要求 选型技术参数 组网方案 施工验收 运维培训 应用案例 4 个…

2026/11/8 19:36:55

哪些特种作业证免考试 电子证书怎么查 老电工都懵了

哪些特种作业证免考试 电子证书怎么查 老电工都懵了 之前考的证在外省能不能转过来?我跟你说,现在这个电子证书,真不是那么好弄的。去年我一个老电工,跑了几趟郑州市应急管理局,才把他在河南新乡考的低压电工证转到山东去,这中间的弯弯绕绕,不是一般…

2026/11/8 19:36:55

上思考电工证怎么考?电子证书怎么申请?建筑工人必看

上思考电工证怎么考?电子证书怎么申请?建筑工人必看 你是不是也在为找工作发愁?是不是听说现在好多工地、项目都需要电工证才能上岗?别急,今天就带你聊聊 上思考电工证 到底怎么考,电子证书怎么申请,特别是咱们 驻马店的建筑工人…

2026/11/8 19:36:55

电工证换证不知道怎么报名?经开区电工证换证怎么报名全攻略来了

电工证换证不知道怎么报名?经开区电工证换证怎么报名全攻略来了 你是不是也在为经开区电工证换证不知道怎么报名而发愁?怕被中介忽悠、怕流程复杂、怕浪费时间和钱?今天咱们就来聊聊这个问题,讲讲如何在经开区顺利办理电工证换证,避免踩坑。…

2026/11/8 19:36:55

鹿寨电工证在哪考 上岗必备证书怎么考

鹿寨电工证在哪考 上岗必备证书怎么考 你现在正面临着一个现实的问题: 急需特种作业证才能上岗找工作 。特别是在电力行业,电工证几乎是 上岗必备…

2026/11/8 0:00:27

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/8 0:00:27

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/7 14:54:47

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代&#xff0c;基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而&#xff0c;与配合度高的人类不同&#xff0c;宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态&#xff0c;更无法控制光照环境。实际应用中&#xff0c;我们常…

2026/11/7 14:50:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑