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

发布时间:2026/9/10 22:59:38

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/9/10 22:59:38

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

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

2026/9/10 22:54:37

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

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

2026/9/10 23:49:43

Tracy Profiler 快速上手实战指南:4步定位游戏掉帧元凶

Tracy Profiler 快速上手实战指南&#xff1a;4步定位游戏掉帧元凶 【免费下载链接】tracy Frame profiler 项目地址: https://gitcode.com/GitHub_Trending/tr/tracy 你正在跑一个游戏&#xff0c;画面突然卡了一瞬&#xff0c;重跑一遍问题又消失了&#xff0c;日志里…

2026/9/10 23:49:42

SeaTunnel与Gravitino集成实现元数据自动化管理

1. 项目概述&#xff1a;当数据管道遇上元数据自动化在数据工程领域&#xff0c;手动维护Schema一直是ETL开发中最繁琐的环节之一。最近SeaTunnel与Gravitino的深度集成&#xff0c;通过RestAPI实现了元数据的自动化管理&#xff0c;这个看似简单的技术组合实际上解决了数据管道…

2026/9/10 23:44:42

H指数解析:学术影响力计算与应用指南

1. H指数&#xff1a;学术影响力的量化标尺作为一名长期跟踪学术评价指标的科研工作者&#xff0c;我经常需要向同行解释H指数的精妙之处。这个看似简单的数字背后&#xff0c;蕴含着对学者研究质量的立体化评估逻辑。2005年由物理学家Jorge Hirsch提出的H指数&#xff0c;如今…

2026/9/10 16:39:38

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊&#xff01;#雷神 #复联”这类调侃式短标题&#xff0c;第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里&#xff0c;但细想一下就能发现&#xff0c;它真正碰到的根本不是…

2026/9/10 11:16:38

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊&#xff0c;可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”&#xff0c;你会发现&#xff0c;这场比较本质上是两个不同 IP 策略的长期结果对比&#xff1a;超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介&#xff1a;本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案&#xff0c;聚焦调制信号自动检测与识别这一典型无线通信任务&#xff0c;解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件&#xff08;10.73MB&#xff09;&…

2026/9/10 0:00:55

目录对比去重实战:用哈希算法精准清理重复文件

我电脑里现在还有一块换了三次机的“数据墓地”硬盘&#xff0c;里面存着2016年以前所有旧笔记本的完整备份。平时不觉得有什么&#xff0c;直到前阵子想把它整理归档&#xff0c;发现同一个安装包、同一批照片、同一份论文草稿&#xff0c;在几个不同的备份目录里反复出现。更…

2026/9/10 0:00:55

Leaflet离线地图完整Demo合集:内网部署与坐标纠偏实战

简介&#xff1a;这是一份面向Web GIS开发者的LeafLet离线地图示例合集&#xff0c;帮助开发者快速掌握离线地图从搭建到交互的完整流程。压缩包共723个文件&#xff0c;大小14.06MB&#xff0c;以319个js脚本、175个html页面和29个css样式文件为主体&#xff0c;配合png/svg图…

2026/9/10 0:00:55

MATLAB读取Rinex 3.02观测文件:多系统GNSS数据解析实战

简介&#xff1a;基于MATLAB开发的Rinex3.02版观测文件&#xff08;o文件&#xff09;读取代码包&#xff0c;面向卫星定位导航方向的学习者与研究人员&#xff0c;用于解决新版观测文件的数据解析、历元提取与时间转换问题。压缩包共4个文件&#xff0c;包含两个m脚本、一个19…

2026/9/10 12:32:02

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行&#xff0c;Type-C接口算是典型的“看着简单&#xff0c;做起来全坑”的东西。光引脚就24个&#xff0c;高低速信号、电源、控制线全部塞在一个小小的连接器里&#xff0c;如果PCB布局不做规划&#xff0c;打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/10 15:19:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/10 15:49:53

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

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

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

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