gin 框架的 JSON Render

gin 框架的 JSON Render

gin 框架默认提供了很多的渲染器,开箱即用,非常方便,特别是开发 Restful 接口。不过它提供了好多种不同的 JSON Render,那么它们的区别是什么呢?

// JSON contains the given interface object.
type JSON struct {Data any
}// IndentedJSON contains the given interface object.
type IndentedJSON struct {Data any
}// SecureJSON contains the given interface object and its prefix.
type SecureJSON struct {Prefix stringData   any
}// JsonpJSON contains the given interface object its callback.
type JsonpJSON struct {Callback stringData     any
}// AsciiJSON contains the given interface object.
type AsciiJSON struct {Data any
}// PureJSON contains the given interface object.
type PureJSON struct {Data any
}

这是框架自带的 6 种 JSON Render:

  • JSON 标准库 JSON
  • IndentedJSON 缩进 JSON
  • SecureJSON 安全 JSON
  • JsonpJSON JSONP JSON
  • AsciiJSON ASCII JSON
  • PureJSON 纯粹的 JSON

下面就让我们来依次看一下它们的区别,不过这里只是简单介绍一下,我主要想说的是默认的 JSON 和 PureJSON,其它的就一笔带过了,不过我也看了一些其它的博客,也把相关链接添加进来了。

代码示例

Standary JSON
通用的 JSON 即是 Golang 自带的 json 库,所以它会自动将html标签进行转义(将它们变成 Unicode 码的形式)。

在这里插入图片描述

gin 默认的 JSON 库是 Go 的标准库,当然为了最求性能,你可以自行替换成其它更快的 JSON 实现(例如 easyjson 等)。

在这里插入图片描述

默认的 JSON 实现,会自动将 HTML 标签进行转义,避免的方法是创建一个 JSON 编码器。

在这里插入图片描述

是否转移,是依靠 escapeHTML 这个属性进行控制的。

在这里插入图片描述

在这里插入图片描述

然后在编码时,会依据该属性来决定是否转义HTML标签(默认开启)。

在这里插入图片描述
这篇博客的探索过程写得很好,还是应该多主动探索:解决Go json.Marshal() 将HTML字符串转义的问题

Pure JSON
字面意思就是 纯粹的 JSON,你可以理解上面的是经过转换的,所以是不纯粹的了。这个 JSON Render 是结果是原汁原味的,我这两天正好输出的 JSON 字符串中带有标签,最后就是用的 Pure JSON 解决的问题。它的注释也说明了,它不像 JSON,不会使用 Unicode 码替换特殊的 HTML 字符。

PureJSON, unlike JSON, does not replace special html characters with their unicode entities.

PureJSON 的实现,设置了 JSON 编码器的 escapeHTML 属性为 false

在这里插入图片描述

在这里插入图片描述

ASCII JSON
这个应该用的比较少了,它用于那些不支持 Unicode 的程序,它会将所有的非 ASCII 字符都转换成 ASCII 的形式了。

在这里插入图片描述

Secure JSON
这个还是比较复杂的,它设计一个安全问题:JSON hijacking,JSON 劫持,可能会泄露敏感数据(看起来是利用了JS的某些高级特性来实施的)。不过它在这里的特点是蛮简单的,那就是它会在数组类型值前面加上 while(1);,参阅资料显示利用它来无限循环阻止攻击者执行 JSON 数组(用于攻击的 JS 脚本)。

想要进一步了解,请参考一下链接:Golang Gin 实战(九)| JSONP跨域和劫持

在这里插入图片描述

Jsonp JSON

Jsonp 是前端常用的一种跨域手段,要想理解它需要一些简单的前端知识。这里的 callback 参数,就是用户在前端已经定义好的一个函数,而整个 JSON 就是它的参数。所以,可以看到响应体是类似这种函数调用的结构。特别的,它的 Content-Type 被设置为 application/javascript
注:如果不设置 callback 参数,则和标准 JSON 结果一样,没有区别。

想要进一步了解,请参考这个链接:Gin 框架 jsonp

在这里插入图片描述

Indented JSON
缩进 JSON,输出经过格式化的 JSON,比较适用于开发调试,这里就不贴图了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/95869.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023 年 Web 安全最详细学习路线指南,从入门到入职(含书籍、工具包)【建议收藏】

第一个方向:安全研发 你可以把网络安全理解成电商行业、教育行业等其他行业一样,每个行业都有自己的软件研发,网络安全作为一个行业也不例外,不同的是这个行业的研发就是开发与网络安全业务相关的软件。 既然如此,那其…

linux入门---信号的理解

目录标题 如何理解计算机中的信号如何查看计算机中的信号初步了解信号的保存和发送如何向目标进程发送信号情景一:使用键盘发送信号情景二:系统调用发送信号情景三:硬件异常产生信号情景四:软件条件产生信号 核心转储信号的两个问…

【安鸾靶场】实战渗透

文章目录 前言一、租房网 (150分)二、企业网站 (300分)三、SQL注入进阶 (550分) 前言 最近看到安鸾的靶场有些比较有意思就打了一下午,有一定难度。 一、租房网 (150分) http://106.15.50.112:8031/ 刚打开burp就报了thinkphp的代码执行 直接getshell flag&a…

华为云云耀云服务器L实例评测|基于canal缓存自动更新流程 SpringBoot项目应用案例和源码

前言 最近华为云云耀云服务器L实例上新,也搞了一台来玩,期间遇到各种问题,在解决问题的过程中学到不少和运维相关的知识。 在之前的博客中,介绍过canal的安装和配置,参考博客 拉取创建canal镜像配置相关参数 & …

【Java】HashMap 背诵版

HashMap 背诵版 1. HashMap、Hashtable 和 ConcurrentHashMap 的区别?1.1 线程安全:1.2 继承关系:1.3 允不允许null值: 2. HashMap 的数据结构2.1 什么是hash表?2.2 HashMap 的数据结构 3. 什么是hash冲突,…

Go 复合数据类型之结构体与自定义类型

Go 复合数据类型之结构体与自定义类型 文章目录 Go 复合数据类型之结构体与自定义类型一、类型别名和自定义类型1.1 类型定义(Type Definition)简单示例 1.2 类型别名简单示例 1.3 类型定义和类型别名的区别 二、结构体2.1 结构体介绍2.2 结构体的定义2.…

day-65 代码随想录算法训练营(19)图论 part 04

463.岛屿的周长 分析: 1.陆地的旁边是海面,存在周长2.陆地在边界上,存在周长 思路一:深度优先遍历 1.通过记录访问情况来访问数据 class Solution { public:int direct[4][2]{{0,1},{0,-1},{1,0},{-1,0}};int res0;void dfs(…

集群服务器

文章目录 项目名:实现集群服务器技术栈通过这项目你学到(或者复习到)实现功能编码环境json环境muduo库boost库MySql数据库登录mysql:查看mysql服务开启了没有?mysql的服务器及开发包库chat,表 allgroup friend groupuser offlinemessage user…

从零开始学习线性回归:理论、实践与PyTorch实现

文章目录 🥦介绍🥦基本知识🥦代码实现🥦完整代码🥦总结 🥦介绍 线性回归是统计学和机器学习中最简单而强大的算法之一,用于建模和预测连续性数值输出与输入特征之间的关系。本博客将深入探讨线性…

Mac上protobuf环境构建-java

参考文献 getting-started 官网pb java介绍 maven protobuf插件 简单入门1 简单入门2 1. protoc编译器下载安装 https://github.com/protocolbuffers/protobuf/releases?page10 放入.zshrc中配置环境变量  ~/IdeaProjects/test2/ protoc --version libprotoc 3.12.1  …

Javascript文件上传

什么是文件上传 文件上传包含两部分, 一部分是选择文件,包含所有相关的界面交互。一部分是网络传输,通过一个网络请求,将文件的数据携带过去,传递到服务器中,剩下的,在服务器中如何存储&#xf…

基于SpringBoot的电影评论网站

目录 前言 一、技术栈 二、系统功能介绍 电影信息管理 电影评论回复 电影信息 用户注册 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了电影评…

Pyhon-每日一练(1)

🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如…

Vue中如何进行分布式路由配置与管理

Vue中的分布式路由配置与管理 随着现代Web应用程序的复杂性不断增加,分布式路由配置和管理成为了一个重要的主题。Vue.js作为一种流行的前端框架,提供了多种方法来管理Vue应用程序的路由。本文将深入探讨在Vue中如何进行分布式路由配置与管理&#xff0…

Spring Boot中的@Controller使用教程

一 Controller使用方法,如下所示: Controller是SpringBoot里最基本的组件,他的作用是把用户提交来的请求通过对URL的匹配,分配个不同的接收器,再进行处理,然后向用户返回结果。下面通过本文给大家介绍Spr…

Java方法:重复使用的操作可以写成方法哦

👑专栏内容:Java⛪个人主页:子夜的星的主页💕座右铭:前路未远,步履不停 目录 一、方法的概念1、什么是方法?2、方法的定义3、方法调用的过程 二、方法重载1、重载的概念2、方法签名 在日常生活中…

计算机网络 快速了解网络层次、常用协议、常见物理设备。 掌握程序员必备网络基础知识!!!

文章目录 0 引言1 基础知识的定义1.1 计算机网络层次1.2 网络供应商 ISP1.3 猫、路由器、交换机1.4 IP协议1.5 TCP、UDP协议1.6 HTTP、HTTPS、FTP协议1.7 Web、Web浏览器、Web服务器1.8 以太网和WLAN1.9 Socket (网络套接字) 2 总结 0 引言 在学习的过程…

【Java-LangChain:使用 ChatGPT API 搭建系统-2】语言模型,提问范式与 Token

第二章 语言模型,提问范式与 Token 在本章中,我们将和您分享大型语言模型(LLM)的工作原理、训练方式以及分词器(tokenizer)等细节对 LLM 输出的影响。我们还将介绍 LLM 的提问范式(chat format…

postgresql-物化视图

postgresql-物化视图 物化视图创建物化视图刷新物化视图修改物化视图删除物化视图 物化视图 创建物化视图 postgresql使用create materialized view 语句创建视图 create materialized view if not exists name as query [with [NO] data];-- 创建一个包含员工统计信息的物化…

java遇到的问题

java遇到的问题 Tomcat与JDK版本问题 当使用Tomcat10的版本用于springmvc借用浏览器调试时,使用JDK8浏览器会报异常。 需要JDK17(可以配置多个JDK环境,切换使用)才可以使用,配置为JAVA_HOME路径,否则&a…