golang encoding/json 使用基础

json 与 encoding/json

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于 ECMAScript(欧洲计算机协会制定的js规范)的一个子集,采用完全独立于语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。json具有以下特点:

  • 易读性:JSON 格式的数据易于阅读和编写,同时也易于机器解析和生成。
  • 轻量级:JSON 的数据格式非常简单,使得数据的传输和存储更加高效。
  • 跨语言:JSON 是一种中立的数据格式,可以被多种编程语言所支持。

encoding/json 是 Go 语言标准库中的一个重要包,它提供了对 JSON 数据格式的编码(序列化)和解码(反序列化)支持;它使得 Go 语言能够轻松、高效地处理 JSON 数据,使得开发者能够方便地将 Go 数据结构序列化为 JSON 格式的字符串,或者将 JSON 字符串反序列化为 Go 的数据结构。

说明

提供的方法

Compact
func Compact(dst *bytes.Buffer, src []byte) error

作用:Compact函数会将src省略不重要的空格字符后追加到json编码的src中。

HTMLEscape
func HTMLEscape(dst *bytes.Buffer, src []byte)

作用:在JSON编码的src中附加<,>,&,U+2028 和 U+2029 字符,字符串字面量更改为 \u003c, \u003e, \u0026, \u2028, \u2029,以便JSON可以安全地嵌入HTML以及script标记中。由于历史原因,web浏览器不支持script标签内的标准HTML转义,因此必须使用替代的JSON编码。

Indent
func Indent(dst *bytes.Buffer, src []byte, prefix, indent string) error

Indent 函数接收一个 JSON 字节切片(通常是通过 Marshal 或 MarshalIndent 函数生成的),以及两个字符串参数:prefix(前缀)和indext(缩进)字符串。函数返回一个新的字节切片,函数内部会将传入其中的 JSON 数据重新格式化,为每个 JSON 对象的键和字符串值都添加前缀和缩进字符串。

Marshal
func Marshal(v any) ([]byte, error)

Marshal 函数用于将 Go 语言中的数据结构(如结构体、切片、映射等)序列化为 JSON 格式字节切片。函数接收一个 Go 语言的对象(可以是任何可以被编码为 JSON 的类型)作为参数,返回一个将该对应值用 JSON 表示的字节切片。

Unmarshal
func Unmarshal(data []byte, v any) error

Unmarshal 函数用于将 JSON 格式的数据反序列化为 Go 语言的数据结构(如结构体、切片、映射等)。函数接收一个 JSON 格式的字节切片作为输入,以及一个指向 Go 语言值的指针作为输出目标,然后尝试将 JSON 数据解析并填充到该值中。

Valid
func Valid(data []byte) bool

作用:检测data是否有效。(这个函数在go1.9才添加)

提供的对象

(提供的这些对象都是比函数更灵活的,但是我目前要快速上手go项目,所以这里没有仔细了解,暂时空着后续补充)

Decoder

Decoder 类型是一个用于从 I/O 流(如文件、网络连接等)中读取和解码 JSON 数据的解码器。Decoder 提供了比 Unmarshal 函数更灵活和高效的方式来处理 JSON 数据,特别是当需要从数据流中连续读取多个 JSON 对象时。
Decoder 类型有一个 Decode 方法,它用于从输入流中读取并解码下一个 JSON 编码的值。可以将一个指向 Go 语言数据结构的指针作为 Decode 方法的参数,以便将解码后的数据填充到该结构中。
使用 Decoder 的一个典型场景是处理从网络连接中接收到的流式 JSON 数据,或者从文件中读取包含多个 JSON 对象的数据。

Delim
Encoder
InvalidUTF8Error
InvalidUnmarshalError
Marshaler
MarshalerError
Number
RawMessage
SyntaxError
Token
UnmarshalerFieldError
UnmarshalerTypeError
Unmarshaler
UnsupportedTypeError
UnsupportedValueError

encoding/json 使用示例

package mainimport ("bytes""encoding/json""fmt"
)// 简单json对象转换测试
func jsonTest1() {fmt.Println("jsonTest1 begin")json1 := map[string]int{"cpp": 10,"js":  8,"go":  10,}bytes, _ := json.Marshal(json1)fmt.Println("基础版go to json: ", string(bytes))if json.Valid(bytes) {var json2 map[string]intjson.Unmarshal(bytes, &json2)fmt.Println("基础版json to go: ", json2)}
}// 复杂对象转换测试
type Seller struct {Id          int    `json:"id"`Name        string `json:"name"`CountryCode string `json:"countrycode"`
}
type Product struct {Id     int    `json:"id"`Name   string `json:"name"`Seller Seller `json:"seller"`Price  int    `json:"price"`
}func jsonTest2() {fmt.Println("jsonTest2 begin")products := []Product{{Id:     50,Name:   "Writing Book",Seller: Seller{1, "ABC Company", "US"},Price:  100,},{Id:     51,Name:   "Kettle",Seller: Seller{20, "John Store", "DE"},Price:  500,},}bytes, _ := json.Marshal(products)fmt.Println("复杂对象 go to json: ", string(bytes))if json.Valid(bytes) {var json2 []Productjson.Unmarshal(bytes, &json2)fmt.Println("复杂对象 json to go: ", json2)}
}// compact 测试
func jsonTest3() {fmt.Println("jsonTest3 begin")var buf bytes.BufferjsonBytes := []byte(`{"cpp": 10,"js": 8,"go": 10}`)err := json.Compact(&buf, jsonBytes)if err != nil {fmt.Println("compact error : ", err.Error())return}fmt.Println("compact 对象 : ", buf.String())jsonBytes1 := []byte(`{"name":"John", "age":30, "city":"New York"}`)json.Indent(&buf, jsonBytes1, "", "  ")fmt.Println("indent 对象 : ", buf.String())
}func main() {jsonTest1()jsonTest2()jsonTest3()
}

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

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

相关文章

SDL系列(一)—— 小白入门

SDL &#xff08; Simple DirectMedia Layer &#xff09; 是一套开放源代码的 跨平台多媒体开发库 &#xff0c;使用 C 语 言写成。 SDL 提供了数种控制图像、声音、输出入的函数&#xff0c;让开发者只要用相同或是相似的 代码就可以开发出 跨多个平台&#xff08; Linu…

618有什么划算的数码产品?4款精选数码好物清单分享,赶紧码住!

随着618购物节慢慢开始&#xff0c;数码产品的大门已经向你敞开&#xff0c;等你来发现里面的各种乐趣。在这个购物的好时节&#xff0c;我们为你准备了一些很不错的数码东西&#xff0c;不管是喜欢新鲜科技的你&#xff0c;还是需要实用小工具的朋友们&#xff0c;这里都有可能…

安卓、iOS、iPad三端搞定,不再剧荒!

哈喽&#xff0c;各位小伙伴们好&#xff0c;我是给大家带来各类黑科技与前沿资讯的小武。 之前给大家推荐过各种看剧姿势&#xff0c;但很多苹果、平板端的小伙伴还是存在更好的需求体验&#xff0c;今天给大家推荐这款可以在安卓、iOS和平板上都能安装使用&#xff0c;不再剧…

2024自学网络安全的三个必经阶段(含路线图)_网络安全自学路线

一、为什么选择网络安全&#xff1f; 这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地&#xff0c;网络安全行业地位、薪资随之水涨船高。 未来3-5年&#xff0c;是安全行业的黄金发展期&#xff0c;提前踏入…

基于Django的图书管理系统

文章目录 前言一、页面展示1.登录2.前端页面3.后端页面 总结 前言 本网站调用Django编写了图书管理网站&#xff0c;可以在后端控制书籍&#xff0c;前端进行书籍预览 一、页面展示 1.登录 2.前端页面 3.后端页面 — ![在这里插入图片描述](https://img-blog.csdnimg.cn/dir…

低功耗音频编解码器CJC8990

由工采网代理的CJC8990是一款低功耗音频编解码器&#xff0c;拥有先进的功能并提供高质量音频&#xff0c;非常适合于便携式数字音频应用&#xff0c;支持多种音频数据格式&#xff0c;包括I2S, DSP模式。 产品介绍&#xff1a; 该芯片工作电压&#xff1a;1.5V&#xff5e;3…

甲方运营工具——安天威胁情报中心每日热点事件爬取

一、背景 本次是采用python爬取安天威胁情报中心的每日热点事件,进行甲方内部威胁情报同步的这样一个需求开发。 界面及内容: 二、逐步实现 2.1、分析请求页面的数据来源 通过请求页面我们看到安天对于第三方引用这些内容的真实性等是不予负责的;我们看到该页面的数据来源…

mysql 行转列 case when 和 聚合函数实现

一、原始数据## 二、行转列 第一步 SELECTCASE WHEN SUBSTRING( aaa.cost_code, 1, 3 ) 100 THEN aaa.budget_cost_budget ELSE 0 END b1,CASE WHEN SUBSTRING( aaa.cost_code, 1, 3 ) 300 THEN aaa.budget_cost_budget ELSE 0 END b2,CASE WHEN SUBSTRING( aaa.cost_cod…

Math.Round()函数说明

Math.Round()并不是严格意义上的是四舍五入函数。它默认的执行的是“银行家舍入”算法&#xff0c;即四舍六入五取偶。概括为&#xff1a;四舍六入五考虑、五后非零就进一&#xff0c;五后皆零看奇偶&#xff0c;五前为偶应舍去、五前为奇要进一。 当为5时&#xff0c;取离着最…

数据库第九次作业官方答案

文章目录 1.12.12.22.32.4 1.1 列出下图所示关系满足的所有非平凡的函数依赖(忽略蕴含的函数依赖)。 A B C − − − − − − − − − − − − ------------ −−−−−−−−−−−− a1 b1 c1 a1 b1 c2 a2 b1 c1 a2 b1 c3 非平凡的函数依赖有&#xff1a;A→B和C→B 2.1 …

淘宝店铺运营爆流课:助你打造高流量店铺,实现销售持续增长(52节课)

课程目录 01【开店类型第1课】货架式店铺.mp4 02【开店类型第2课】短视频店铺.mp4 03【开店类型第3课】直播型店铺.mp4 04【店铺基础操作第1课】如何发布一个成功的宝贝.mp4 05【店铺基础操作第2课】商品SKU设置技巧及库存设置方法.mp4 06【标题】如何制作一个爆款标题.mp…

微前端的概念

微前端是一种架构模式&#xff0c;用于构建单个现代web应用程序的多个小型独立前端应用。每个前端应用都有自己的代码库、技术栈和团队&#xff0c;并可以独立开发、测试、部署和运行。这些小型前端应用被组合在一起以形成一个完整的前端应用程序。 微前端的核心思想是将前端应…

寄大件家具用什么物流便宜,寄沙发大件物流便宜

在现代生活中&#xff0c;搬家或重新布置家居时&#xff0c;沙发作为体积较大、价值较高的家具&#xff0c;选择一个经济实惠的物流服务至关重要。 1、对于近距离的运输&#xff0c;同城寄沙发可以找个车直接拉过去比较划算&#xff0c;省外的可以试试像我这样邮寄&#xff1b;…

2244. 完成所有任务需要的最少轮数 --力扣 -- JAVA

题目 给你一个下标从 0 开始的整数数组 tasks &#xff0c;其中 tasks[i] 表示任务的难度级别。在每一轮中&#xff0c;你可以完成 2 个或者 3 个 相同难度级别 的任务。 返回完成所有任务需要的 最少 轮数&#xff0c;如果无法完成所有任务&#xff0c;返回 -1 。 解题思路 找…

手机怎么制作搞笑gif?来看看这一个方法

动态图片是现在网络中很流行的一种图片格式&#xff0c;可以把多个jpg、png格式静图变成一张gif格式的动图。在各大社交媒体中非常的受欢迎&#xff0c;用简单快速的方法传递信息。当我们想要通过手机制作gif动画的时候&#xff0c;要如何操作呢&#xff1f;这时候&#xff0c;…

Java后端面试常见问题

Java后端面试 经历了两个月的面试和准备&#xff0c;下面对常见的八股文进行总结。有些问题是网上看到的面经里提到的&#xff0c;有些是我真实面试过程遇到的。 异常 1、异常分为哪几种&#xff1f;他们的父类是什么&#xff1f; 注意&#xff1a;所有异常对象的父类为Thr…

瑞_Docker安装教程(超详细图文步骤,含卸载、离线安装)

文章目录 1 CentOS 在线安装 Docker1.1 卸载旧版Docker1.2 安装Docker1.2.1 安装Docker的yum库1.2.2 配置Docker的yum源1.2.3 安装Docker-CE1.2.4 启动和校验&#xff08;开机自启&#xff09;1.2.5 配置镜像加速 1.3 安装 Docker Compose1.4 启动和校验&#xff08;开机自启&a…

Acrel-1000变电站综合自动化监控系统 实时测控保护、远动于一体

​一、 系统概述 1.1 概述 Acrel-1000 变电站综合自动化监控系统&#xff0c;是我司根据电力系统自动化及无人值守的要求&#xff0c;总结国内外的研究和生产的先进经验&#xff0c;专门研制出的新一代电力监控系统。本系统具有保护、遥测、遥信、遥脉、遥调、遥控功能&#x…

Python代码:三、读入字符串

1、题目 从变量输出开始。请使用input函数读入一个字符串&#xff0c;然后将其输出。 2、代码 import sys ainput() print(a) 3、在sublime运行的结果

DIYGW UniApp可视化工具:低代码时代的前端开发新体验

摘要&#xff1a; 随着技术的不断发展&#xff0c;前端开发领域也迎来了低代码时代的浪潮。本文介绍了DIYGW UniApp可视化工具&#xff0c;这款工具以其傻瓜式、拖拽式、模块化的特性&#xff0c;为前端开发者提供了一个全新的开发体验。通过DIYGW UniApp&#xff0c;用户无需深…