Golang笔记:使用json包处理JSON数据

news2024/10/7 10:19:28

文章目录

  • 目的
  • Decoding(解析数据)
  • Encoding(创建数据)
  • 总结

目的

JSON 是一种非常流行的数据交换格式,是JavaScript中原生支持的一种数据,因为其简单方便,所以也经常用在不同程序、不同语言间数据交互。这篇文章将介绍在Golang中使用JSON相关内容( encoding/json )。

Decoding(解析数据)

可以使用 encoding/json 包的 func Unmarshal(data []byte, v any) error 方法,从原始JSON字符串中解析对应内容到指定数据结构中。比如下面示例将解析数据到结构体中:

package main

import (
	"encoding/json"
	"fmt"
)

type data struct {
	Num int    `json:"num"`
	Bl  bool   `json:"bl"`
	Str string `json:"str"`
	Arr []int  `json:"arr"`
	Obj struct {
		Num int `json:"num"`
	} `json:"obj"`
} // 用于接收JSON字符串中内容的结构体类型

func main() {
	var j data
	s := `{
		"num": 233,
		"bl": true,
		"str": "naisu",
		"arr": [
		  22,
		  33
		],
		"obj": {
		  "num": 777
		}
	  }` // 原始JSON字符串

	json.Unmarshal([]byte(s), &j) // 从原始数据中解析内容填充结构体对象

	fmt.Println(j.Num, j.Bl, j.Str, j.Arr, j.Obj)
}

在这里插入图片描述
上面例子操作比较简单,但是演示了JSON的几种基本的数据格式。需要注意的是 结构体中字段名称首字母需要大写

如果有现成的JSON数据范本的话可以通过下面工具直接生成结构体类型声明:
https://mholt.github.io/json-to-go/
在这里插入图片描述

上面演示中结构体类型中字段和原始JSON数据中字段是可以一一匹配上的,但如果两者无法一一匹配,也可以进行解析。 结构体中有而JSON中没有的字段,那么解析之后结构体对象中这些字段将会填充默认值。结构体中没有而JSON中有的字段,那么解析时会忽略这些字段。

上面方式对于已知格式的JSON数据解析时比较好用,但是对于未知格式的JSON数据解析就不太好用了。通常可以使用泛型来处理,比如可以使用 map[string]interface{} 接收对象,使用 []interface{} 接收数组。请看下面示例:

package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	var j map[string]interface{}

	s := `{
		"num": 233,
		"bl": true,
		"str": "naisu",
		"arr": [
		  22,
		  33
		],
		"obj": {
		  "num": 777
		}
	  }` // 原始JSON字符串

	if err := json.Unmarshal([]byte(s), &j); err != nil {
		fmt.Println(err)
	}

	fmt.Println(j)

	for k, v := range j {
		switch vv := v.(type) {
		case bool:
			fmt.Println(k, "is bool", vv)
		case string:
			fmt.Println(k, "is string", vv)
		case float64:
			fmt.Println(k, "is float64", vv)
		case []interface{}:
			fmt.Println(k, "is array:")
			for i, u := range vv {
				fmt.Println(i, u)
			}
		case map[string]interface{}:
			fmt.Println(k, "is oject:", v)
		default:
			fmt.Println(k, "is of a type I don't know how to handle")
		}
	}
}

在这里插入图片描述

现在有泛型了, interface{} 也可以使用 any 来代替。

Encoding(创建数据)

可以使用 encoding/json 包的 func Marshal(v any) ([]byte, error) 方法将Golang数据类型生成JSON字符串。比如下面例子:

package main

import (
	"encoding/json"
	"fmt"
)

type data struct {
	Num int    `json:"num"`
	Bl  bool   `json:"bl"`
	Str string `json:"str"`
	Arr []int  `json:"arr"`
	Obj struct {
		Num int `json:"num"`
	} `json:"obj"`
} // 用于接收JSON字符串中内容的结构体类型

func main() {
	j := data{
		Num: 233,
		Bl:  true,
		Str: "naisu",
	}
	j.Arr = append(j.Arr, 22, 33)
	j.Obj.Num = 777

	b, err := json.Marshal(j) // 将结构体转换成JSON字符串
	if err != nil {
		fmt.Println(err)
	}

	fmt.Println(string(b))
}

在这里插入图片描述

数据也可以通过接口或泛型等类型进行转换:

package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	j := make(map[string]any)
	j["Num"] = 233
	j["Bl"] = true
	j["Str"] = "naisu"
	Arr := []int{}
	Arr = append(Arr, 22, 33)
	j["Arr"] = Arr
	Obj := make(map[string]any)
	Obj["Num"] = 777
	j["Obj"] = Obj

	b, err := json.Marshal(j) // 将结构体转换成JSON字符串
	if err != nil {
		fmt.Println(err)
	}

	fmt.Println(string(b))
}

在这里插入图片描述

总结

对于JSON的操作主要内容就是这些了。如果需要更加细节的解析和创建的控制可以使用 MarshalJSON 或者 UnmarshalJSON 等方法。

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

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

相关文章

Linux5.6 Mysql备份与恢复

文章目录 计算机系统5G云计算第四章 LINUX Mysql备份与恢复一、数据库备份的分类1. 数据备份的重要性2.数据库备份的分类3. 常见的备份方法1)物理冷备2)专用备份工具mysqldump或mysqlhotcopy3)启用二进制日志进行增量备份4)第三方…

8.2 网络分层OSI七层模型

目录 计算机网络体系结构的形成 两台计算机要互相传送文件需解决很多问题 提出了不同体系结构 国际标准:开放系统互连参考模型 OSI/RM 但 ISO/OSI 失败了 存在两种国际标准 协议与划分层次 协议与划分层次 协议的两种形式 层次式协议结构 划分层次的概念举…

卷积计算加速方法--分块卷积

1、大尺寸卷积存在的问题 当卷积的输入太大导致内存不够用时,考虑将一大块卷积分成多个小块分别进行卷积,相当于将原始输入分成几个小的输入经过同一组卷积核分别卷积,其中每块小的输入都是原始输入的子集,每块之间互不影响&#…

OpenHarmony社区运营报告(2023年5月)

本月快讯 ● 2023年6月11-13日,2023开放原子全球开源峰会即将在北京北人亦创国际会展中心盛大开幕。2023开放原子全球开源峰会上,OpenAtom OpenHarmony(以下简称“OpenHarmony”)将通过分论坛与展览等方式,展示生态进展…

C# 特性详解

目录 特性是什么? 如何使用特性? (1).Net 框架预定义特性 (2)自定义特性 为什么要使用特性? 特性的应用 特性实现枚举展示描述信息 特性是什么? 特性(Attribute&…

划重点!超全PMP报考指南,速速收藏!

PMP证书作为项目管理专业人士的重要标志,是每一位项目经理职业发展生涯中不可或缺的证书。PMP学习不仅可以提升项目经理的项目管理水平,也可以进一步提升项目经理的个人竞争力。 一,PMP介绍 PMP(项目管理专业人士资格认证&#…

新建一个vue2项目

安装Vue CLI 在终端中输入以下命令进行全局安装: npm install -g vue/cli 创建Vue项目 1.在你要创建项目的目录下打开终端输入vue create 【你的项目名称】 2.手动选择安装 3.根据自己的需求选择 4.选择vue版本 5.是否使用calss风格的组件语法: (推荐…

8.1 什么是互联网

目录 计算机网络的定义与分类 计算机网路的定义 几种不同类别的计算机网络 按照网络的作用范围进行分类 按照网络的使用者进行分类 网络的网络 计算机网络 互连网络 网络与互连网 互联网 互联网的组成 互联网的边缘部分 互联网基础结构发展的三个阶段 第一阶段&a…

JavaWeb小记——Servlet

目录 Servlet概念 Servlet快速入门 1.创建web项目 2.创建一个Java类,实现Servlet接口 3.重写接口中的service()方法 4.配置Servlet——web.xml中 5.发布项目 6.发送请求,请求Servlet Servlet原理 Servlet的生命周期 1.init() 2.service() 3.…

el-form 表单项前面显示星号 但又不校验这一项代码怎么实现

效果图&#xff1a; 1.将 prop 属性设置为空字符串&#xff1b; 2.同时将 required 属性设置为 true。 这样就可以显示星号但不进行校验。 示例代码&#xff1a; <el-form> <el-form-item label"姓名" prop"name" required> <el-input…

SAP ERP系统PP模块控制BOM的变更是否需要ECN的三种解决方法<转载>

原文链接&#xff1a;http://www.360doc.com/content/12/0121/07/1079063886_1079063886.shtml BOM简称物料清单&#xff0c;它是PC和MC部门编制生产计划&#xff0c;物料采购和生产计划的依据&#xff0c;也是财务成本核算的基础&#xff0c;它的重要性不言而喻。 一个公司的…

Go语言精进之路读书笔记—第二章 项目结构、代码风格与标识符命名

上面是go语言库项目结构&#xff0c;细节补充如下&#xff1a; cmd目录&#xff1a; 存放项目要构建的可执行文件对应的main包源文件。 pkg目录&#xff1a; 项目自身要使用并且同样也是可执行文件对应main包要依赖的库文件。 makefile&#xff1a; 代码任何第三方构建工具脚本…

设备算法加密授权“安全+易用=?”

一提到软件授权&#xff0c;大家的第一反应都是“安全”和“易用”的问题&#xff0c;尤其是在算法加密授权领域。软件企业想要十足的安全性用来防止反编译&#xff0c;同时又需要具备灵活和易用来促使企业商业模式落地。那现在市面上是否有这样一款兼顾“安全性”和“易用性”…

谈谈:File、Blob、FileReader、ArrayBuffer、base64

JavaScript 提供了一些 API 来处理文件或原始文件数据&#xff0c;例如&#xff1a;File、Blob、FileReader、ArrayBuffer、base64 等。下面就来看看它们都是如何使用的&#xff0c;它们之间又有何区别和联系。 1. Blob Blob全称为binary large Object 即二进制大对象&#x…

嵌入式软件开发工程师具体可以分三类

嵌入式软件开发工程师可以根据其职责和专长分为以下三类&#xff1a;底层固件开发工程师&#xff1a;底层固件开发工程师负责编写和优化嵌入式系统的底层软件&#xff0c;与硬件密切相关。他们通常需要熟悉处理器架构、寄存器级编程、中断处理、设备驱动程序和实时操作系统&…

Oracle21C + PLSQL Developer 15 + Oracle客户端21安装配置完整图文版

一、Oracle21C PLSQL Developer 15 Oracle客户端文件下载 1、Oracl21C下载地址&#xff1a;https://www.oracle.com/cn/database/technologies/oracle-database-software-downloads.html 2、 PLSQL Developer 15下载地址&#xff1a;https://www.allroundautomations.com/re…

微信支付(JSAPI支付)/支付宝支付(手机网站支付)实现思路及实现方案-无源码

背景 停车系统 一个二维码同时支持微信及支付宝扫码付款&#xff0c;使用手机网站实现 临时车费用缴费二维码需要通知支持微信及支付宝。用户缴纳的停车费直接到各个商户的账户上&#xff0c;不经过停车系统开发公司。 方案 微信&#xff1a;使用微信服务商提供的服务支付…

【twcc】学习2:cc-feedback包送去cc预估码率

继续学习1,学习1中是准备知识,实际操练是在本文的预估中。 主要是对照大神的神作第八章 学习。 大量引用了大神的内容。 学习1中,大神主要论述了发送侧如何构造cc-fb,等待收到rtcp-cc-fb后进行再更新,然后最终交给cc模块。 这是大神绘制的图片,总结的非常清晰到位: 大神…

归一化详细推导

1. 一组数减去平均数的差的和为0。 一组数:a1,a2,a3,……,an, 平均数:a=(a1+a2+……+an)/n, 则 a1+a2+……+an=n*a, 从而,每一个数减去平均数的差的和为 (a1-a)+(a2-a)+……+(an-a) =(a1+a2+……+an)-n*a =0 2. 设原始数据均值及标准差为,将原始数组经过变换后得到使得均…

保护您的网站免受黑客攻击的七个良好习惯

世界上通常有三种类型的网站/APP拥有者&#xff1a;第一种是一直具备较高风险意识的人、第二种是非常自信认为没有任何东西可以攻击和破坏他们网站的人&#xff0c;第三种&#xff1a;根本不关心它的人。 第二种远比另外两种人更容易感受后悔和痛苦。实际上&#xff0c;黑客攻…