当前位置: 首页 > 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…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...