当前位置: 首页 > news >正文

【Go】Go数据操作 - 处理JSON文件

目录

何为JSON 

编码JSON

实践时刻

解码JSON

实践时刻

延伸拓展


何为JSON 

       JSON (JavaScript Object Notation, JS对象简谱)是一种轻量级的数据交换格式。JSON最初是JavaScript的一部分,后由于便于快速编写的特性,被开发者独立出来。基本上所有的语言都支持JSON数据的编码和解码。对于网络编程而言,JSON的重要性不言而喻。

        JSON中的键以字符串存储,值可以取任意类型。

        它有以下三种结构:

  1. 字符串或数组类型:{"name":"Mark","age":18}
  2. JSON数组:[{"name":" Tom","age":18},{"name":"Jerry","age":17}]
  3. 嵌套类型:{"name":" Tom", "birthday":{"month":12,"day":25}}

        大括号“{}”用来描述一组“不同类型的无序键值对集合”,方括号“[]”用来描述一组“相同类型的有序数据集合”。


编码JSON

        GO的标准库提供了 encoding/json 来处理JSON。涉及到的接口有以下几种:

func Marshal(v interface{}) ([]byte, error)

        Marshal函数要求提供一个接口类型的参数,通常interface{}类型会用结构体和map等数据结构来传入。

        还有一种JSON编码接口,提供格式化输出的操作:

func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error)

        MarshalIndent是Marshal的升级版,可以按照所设计的特定格式进行格式化输出。其中prefix参数用于对每字段进行标记分隔。

实践时刻

        代码示例:

/*
------------------------------------------------------------------------------- @FILE    map2json.go- @AUTHOR  MAX TSANG- @EMAIL   ZIHANTSANG@HOTMAIL.COM- @DATE    2023/07/23 16:46:43- @BRIEF   MAP2JSON------------------------------------------------------------------------------
*/package mainimport ("encoding/json""fmt"
)func main() {data_map := make(map[string]interface{}, 5)data_map["name"] = "Mark"data_map["sex"] = "male"data_map["age"] = 24data_map["birth"] = "1998-01-01"data_map["Education"] = []string{"Bachelor,Master"}res, _ := json.Marshal(data_map) //_对error信息省略res_format, _ := json.MarshalIndent(data_map, "", "      ")fmt.Println("result = ", string(res))fmt.Println("result with format = ", string(res_format))
}

        输出结果:

        除此之外,我们还可以用结构体struct来与JSON进行互转

        * 一般情况下,推荐都使用结构体struct来进行编解码操作

        代码示例:

/*
------------------------------------------------------------------------------- @FILE    struct2json.go- @AUTHOR  MAX TSANG- @EMAIL   ZIHANTSANG@HOTMAIL.COM- @DATE    2023/07/23 16:51:22- @BRIEF	 STRUCT2JSON------------------------------------------------------------------------------
*/package mainimport ("encoding/json""fmt"
)type Resume struct {Name      string   `json:"name "`Sex       string   `json:"sex "`Age       int      `json:"age "`Education []string `json:"education "`Inservice bool     `json:"inservice "`
}func main() {resume := Resume{"Mark", "female", 24,[]string{"bachelor,master"}, false}res, err := json.MarshalIndent(resume, "", "     ")if err != nil {fmt.Println(err)}fmt.Println("result = ", string(res))
}

        输出结果:

 在编辑struct字段时,可以在字段后添加标签来控制编解码的过程。控制字段有以下三种:

  1. - : 不解析该字段
  2. omitempty : 当字段为空或长度为0(map array string等结构)时不解析
  3. FieldName: 解析JSON时,使用该名称 (在代码示例中的name sex age ... 这些都属于FieldName)

解码JSON

        在对JSON解码时,标准库提供了Unmarshal接口。

func Unmarshal(data []byte, v interface{}) error

        Unmarshal函数解析JSON时,需要传入一个接口类型的参数,而写入接口有以下类型:

数据类型对照关系
Bool对应JSON布尔类型
float64对应JSON数字类型
string对应JSON字符串类型
[]interface{}对应JSON数组
map[string]interface{}对应JSON对象
nil对应JSON的null

        当JSON值与给出的目标类型不匹配或JSON输出的值超出写入目标类型的范围内,Unmarshal会自动跳过该字段并完成其余的解码操作 。

实践时刻

        代码示例:

/*
------------------------------------------------------------------------------- @FILE    json2map.go- @AUTHOR  MAX TSANG- @EMAIL   ZIHANTSANG@HOTMAIL.COM- @DATE    2023/08/09 12:24:07- @BRIEF   JSON2MAP------------------------------------------------------------------------------
*/
package mainimport ("encoding/json""fmt"
)func main() {//一串模拟Json文本js := `
{"name":"Mark","sex":"male","age":24,"birth":"1998-01-01","Education":["Bachelor","Master"]
}`m := make(map[string]interface{}, 5)err := json.Unmarshal([]byte(js), &m) //将json解码并传至mif err != nil {fmt.Println(err)}fmt.Println("map = ", m)for k, v := range m {switch data := v.(type) /*类型值.(type)可以取到其数据类型*/ {case string:fmt.Printf("map[%s]的值类型为string,value = %s\n", k, data)case []string:fmt.Printf("map[%s]的值类型为[]string,value = %v\n", k, data)case float64:fmt.Printf("map[%s]的值类型为int,value = %f\n", k, data)case bool:fmt.Printf("map[%s]的值类型为bool,value = %t\n", k, data)case []interface{}:fmt.Printf("map[%s]的值类型为[]interface{},value = %v\n", k, data)}}
}

        输出结果:

         不难发现,解码json时若采用map结构,则需对值的数据类型进行判断,才可正确进行输出调用。struct结构体相较于map,可以很好解决这类问题,JSON库也会自动对结构体的类型进行解析,无需进行类型判断。

        代码示例:

/*
------------------------------------------------------------------------------- @FILE    json2struct.go- @AUTHOR  MAX TSANG- @EMAIL   ZIHANTSANG@HOTMAIL.COM- @DATE    2023/08/09 12:42:12- @BRIEF   JSON2STRUCT------------------------------------------------------------------------------
*/
package mainimport ("encoding/json""fmt"
)type Resume2 struct {Name      string   `json:"name"`Sex       string   `json:"sex"`Age       int      `json:"age"`Education []string `json:"education"`Inservice bool     `json:"inservice"`
}func main() {js := `
{"name":"Mark","sex":"male","age":24,"education":["Bachelor","Master"],"Inservice":false
}`var resume Resume2err := json.Unmarshal([]byte(js), &resume)if err != nil {fmt.Println(err)}fmt.Printf("resume = %+v", resume)}

        输出结果:


延伸拓展

        Go所提供的标准 "encoding/json" 可以满足我们基本的对于JSON的编码、解码操作,但性能上并不是最佳,有一个性能更好的开源项目- Fastjson 可以帮助我们解决这个问题。如果感兴趣,可以到GitHub上查找该项目

相关文章:

【Go】Go数据操作 - 处理JSON文件

目录 何为JSON 编码JSON 实践时刻 解码JSON 实践时刻 延伸拓展 何为JSON JSON (JavaScript Object Notation, JS对象简谱)是一种轻量级的数据交换格式。JSON最初是JavaScript的一部分,后由于便于快速编写的特性,被开发者独立出来。基本上所有的语…...

服务器之LNMP

lnmp的构成 L:linux系统,操作系统。 N:nginx网站服务,前端,提供前端的静态页面服务。同时具有代理,转发的作用。 转发:主要是转发后端请求。转发到PHP。nginx没有处理动态资源的功能,他有可以支持转发动态请求的模块。 M&…...

恒运资本:定向增发一般多久完成?

随着现代企业的不断发展壮大,企业需求的资金也越来越多,而定向增发成为了企业融资的一个不可或缺的方法之一。那么,定向增发一般需求多长时刻来完结呢?本文将从多个角度进行剖析,以期对此问题有更深化的了解。 一、 定…...

mysql进阶篇(二)

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄,vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…...

考研C语言进阶题库——更新31-32题

目录 31.姜太公门前有一个池塘,他每天都会去池塘里面钓鱼,他钓鱼技术非常高,距离水面五米的深度之内,包括五米的鱼,他都能钓到池塘里面一共有n条鱼,给出每条鱼距离水面的高度,问姜太公一次能钓…...

机动车号牌正则表达式(兼容新能源车牌)

说明:“|”前面面是绿牌车(8位)规则,“|”后面是蓝牌车(7位)规则。 ([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领]A-Z)|(([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵…...

idea如何上传项目到github(超详细)

idea如何上传项目到github 1、IDEA配置2、项目上传到本地仓库2.1、创建本地git仓库2.2、Add操作2.3、Commit操作 3、项目上传到Github4、拿到登录Github的token 1、IDEA配置 File-Settings-VersionControl-Git Git的安装路径下bin目录下的git.exe可执行文件 可以直接点 Gene…...

护网专题简单介绍

护网专题简单介绍 一、护网红蓝队介绍1.1、网络安全大事件1.2、护网行动由来1.3、护网行动中的角色二、红队介绍2.1、红队所需技能2.2、红队攻击流程 三、蓝队介绍3.1、蓝队所需技能3.2、蓝队防守四阶段3.3、蓝队前期准备 四、常见安全厂商介绍4.1、常见安全厂商 五、常见安全产…...

GO学习之 网络通信(Net/Http)

GO系列 1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 6、GO学习之 通道(Channel) 7、GO学习之 多线程(goroutine) 8、GO学习之 函数(Function) 9、GO学习之 接口(Interface) 10、 文章目录 GO系列前言一、H…...

<dependency> idea中为什么这个变黄色

在IDE中&#xff0c;当你的代码出现黄色高亮时&#xff0c;通常表示存在警告或建议的提示。对于Maven的<dependency>标签来说&#xff0c;黄色高亮可能有以下几种原因&#xff1a; 依赖项未找到&#xff1a;黄色高亮可能表示IDE无法找到指定的依赖项。这可能是由于配置错…...

SA8000 社会责任要求之健康安全准则

【SA8000 社会责任要求之健康安全准则】 健康和安全 准则 3.1 组织应提供一个安全和健康的工作环境&#xff0c;并应采取有效的措施防止潜在的健康和安全事故和职业伤害&#xff0c;或在工作的过程中发生的或引起的疾病。基于产业相关的安全与健康的知识以及任何特定的危害&…...

SpringMVC的架构有什么优势?——控制器(三)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…...

AI和ChatGPT:人工智能的奇迹

AI和ChatGPT&#xff1a;人工智能的奇迹 引言什么是人工智能&#xff1f;ChatGPT&#xff1a;AI的语言之王ChatGPT的工作原理ChatGPT的优势和挑战AI和ChatGPT的未来展望结论 引言 人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;是一项令人兴奋的…...

掌握 JVM 的参数及配置

点击下方关注我&#xff0c;然后右上角点击...“设为星标”&#xff0c;就能第一时间收到更新推送啦~~~ JVM&#xff08;Java虚拟机&#xff09;是Java编程语言的核心组件之一&#xff0c;它负责执行Java程序&#xff0c;并提供一系列参数和配置选项&#xff0c;可以调整Java程…...

如何高性能、高效率地实现3D Web轻量化?

随着互联网和Web技术的发展&#xff0c;3D Web应用的需求越来越多。然而&#xff0c;复杂的3D模型在Web上展示和交互通常需要大量的带宽和计算资源。为了解决这一问题&#xff0c;HOOPS技术作为一套专业的3D图形技术开发工具包&#xff0c;发挥着关键作用。本文将探讨HOOPS技术…...

【Linux 网络】 传输层协议之TCP协议 TCP的三次握手和四次挥手

TCP协议 TCP协议段格式谈谈什么是 “可靠” 和 “不可靠”TCP协议段——序号与确认序号TCP协议段——窗口大小TCP协议段 —— 六个标志位确认应答机制&#xff08;ACK&#xff09;超时重传机制连接管理机制TCP 的三次握手四次挥手TCP三次握手四次挥手总结图 滑动窗口流量控制拥…...

git仓库与本地暂存区的同步问题

向下同步 对于远程仓库的项目&#xff0c;初始化一个配置文件&#xff0c;配置远程仓库及相关信息&#xff0c;赋值远程仓库的地址&#xff0c;使用git pull命令即可拉取仓库代码。 git pull [remote_addr] 该部分完成向下同步 向上同步 向上同步时会遇到很多的问题&#xf…...

MATLAB算法实战应用案例精讲-【图像处理】图像分类模型-LeNetAlexNetVGG

目录 LeNet 模型介绍 模型结构 模型实现 模型特点 模型指标 AlexNet...

ArcGIS API for JavaScript 4.x 教程(二)切换基础地图图层

了解如何更改地图中的基础地图图层。 基础地图图层&#xff1a; 基础地图层是用于访问和显示来自基础地图层服务的数据的层。它为地图或场景提供视觉和地理上下文&#xff0c;通常包含具有管理边界和地名的全局数据。 基本地图图层服务提供了许多基本地图图层样式&#xff0c;例…...

SpringBoot——如何读写使用JSON文件保存的数据

文章目录 1. 将数据写入JSON文件2. 从JSON文件读取数据2.1 读取单个对象2.2 读取对象列表 1. 将数据写入JSON文件 要将数据写入JSON文件&#xff0c;可以使用Spring Boot中提供的Jackson库。Jackson库是处理JSON的Java库&#xff0c;可以轻松地将对象转换为JSON字符串&#xff…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

redis和redission的区别

Redis 和 Redisson 是两个密切相关但又本质不同的技术&#xff0c;它们扮演着完全不同的角色&#xff1a; Redis: 内存数据库/数据结构存储 本质&#xff1a; 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能&#xff1a; 提供丰…...