Go语言的JSON 库

2023-11-03

1、Go语言的JSON 库

Go语言自带的JSON转换库为 encoding/json

1.1)其中把对象转换为JSON的方法(函数)为 json.Marshal(),其函数原型如下

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

也就是说,这个函数接收任意类型的数据 v,并转换为字节数组类型,返回值就是我们想要的JSON数据和一个错误代码。当转换成功的时候,这个错误代码为nil

在进行对象转换为 JSON 的过程中,会遵循如下几条规则:

• 布尔型转换为 JSON 后仍是布尔型 , 如true -> true

• 浮点型和整数型转换后为JSON里面的常规数字,如 1.23 -> 1.23

• 字符串将以UTF-8编码转化输出为Unicode字符集的字符串,特殊字符比如<将会被转义为\u003c

• 数组和切片被转换为JSON 里面的数组,[]byte类会被转换为base64编码后的字符串,slice的零值被转换为null

• 结构体会转化为JSON对象,并且只有结构体里边以大写字母开头的可被导出的字段才会被转化输出,而这些可导出的字段会作为JSON对象的字符串索引

• 转化一个map 类型的数据结构时,该数据的类型必须是 map[string]T(T 可以是encoding/json 包支持的任意数据类型)

1.2)把 JSON 转换回对象的方法(函数)为 json.Unmarshal(),其函数原型如下

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

这个函数会把传入的 data 作为一个JSON来进行解析,解析后的数据存储在参数 v 中。这个参数 v 也是任意类型的参数(但一定是一个类型的指针),原因是我们在是以此函数进行JSON 解析的时候,这个函数不知道这个传入参数的具体类型,所以它需要接收所有的类型。

那么,在进行解析的时候,如果JSON 和 对象的结构不对口会发生什么呢,这就需要解析函数json.Unmarshal()遵循以下规则

• json.Unmarshal() 函数会根据一个约定的顺序查找目标结构中的字段,如果找到一个即发生匹配。那什么是找到了呢?关于“找到了”又有如下的规则:假设一个JSON对象有个名为"Foo"的索引,要将"Foo"所对应的值填充到目标结构体的目标字段上,json.Unmarshal() 将会遵循如下顺序进行查找匹配

§ 一个包含Foo 标签的字段

§ 一个名为Foo 的字段

§ 一个名为Foo 或者Foo 或者除了首字母其他字母不区分大小写的名为Foo 的字段。 这些字段在类型声明中必须都是以大写字母开头、可被导出的字段。

注意:如果JSON中的字段在Go目标类型中不存在,json.Unmarshal() 函数在解码过程中会丢弃该字段。

• 当JSON 的结构是未知的时候,会遵循如下规则:

§ JSON中的布尔值将会转换为Go中的bool类型

§ 数值会被转换为Go中的float64类型

§ 字符串转换后还是string类型

§ JSON数组会转换为[]interface{} 类型

§ JSON对象会转换为map[string]interface{}类型

§ null值会转换为nil

注意:在Go的标准库encoding/json包中,允许使用map[string]interface{}和[]interface{} 类型的值来分别存放未知结构的JSON对象或数组

2、代码实例

假设我们有如下一个类(结构体)student 及其一个实例对象st:
复制代码

type Student struct {
Name string
Age int
Guake bool
Classes []string
Price float32
}

st := &Student {
“Xiao Ming”,
16,
true,
[]string{“Math”, “English”, “Chinese”},
9.99,
}

复制代码

现在我们需要把这个类的一个对象转换为JSON格式,并且传输给远方的朋友,那么我们就可以这么做:

b, err := json.Marshal(st)

这样就转换好了。是不是很简单!转换回来就更简单了,比如我们有一个新的student对象,就叫stb,那么我们可以这样转换回来:

stb := &Student{}
err = json.Unmarshal([]byte(strData), &stb)

这样就转换回来了,是不是很简单!

下面是完整代码及运行结果:

$ cat gojson.go
复制代码

1 package main
2
3 import (
4 “fmt”
5 “encoding/json”
6 )
7
8 type Student struct {
9 Name string
10 Age int
11 Guake bool
12 Classes []string
13 Price float32
14 }
15
16 func (s * Student)ShowStu() {
17 fmt.Println(“show Student :”)
18 fmt.Println("\tName\t:", s.Name)
19 fmt.Println("\tAge\t:", s.Age)
20 fmt.Println("\tGuake\t:", s.Guake)
21 fmt.Println("\tPrice\t:", s.Price)
22 fmt.Printf("\tClasses\t: “)
23 for _, a := range s.Classes {
24 fmt.Printf(”%s “, a)
25 }
26 fmt.Println(”")
27 }
28
29 func main() {
30 st := &Student {
31 “Xiao Ming”,
32 16,
33 true,
34 []string{“Math”, “English”, “Chinese”},
35 9.99,
36 }
37 fmt.Println(“before JSON encoding :”)
38 st.ShowStu()
39
40 b, err := json.Marshal(st)
41 if err != nil {
42 fmt.Println(“encoding faild”)
43 } else {
44 fmt.Println(“encoded data : “)
45 fmt.Println(b)
46 fmt.Println(string(b))
47 }
48 ch := make(chan string, 1)
49 go func(c chan string, str string){
50 c <- str
51 }(ch, string(b))
52 strData := <-ch
53 fmt.Println(”--------------------------------”)
54 stb := &Student{}
55 stb.ShowStu()
56 err = json.Unmarshal([]byte(strData), &stb)
57 if err != nil {
58 fmt.Println(“Unmarshal faild”)
59 } else {
60 fmt.Println(“Unmarshal success”)
61 stb.ShowStu()
62 }
63 }

复制代码

运行结果:
复制代码

$ go run gojson.go
before JSON encoding :
show Student :
Name : Xiao Ming
Age : 16
Guake : true
Price : 9.99
Classes : Math English Chinese
encoded data :
[123 34 78 97 109 101 34 58 34 88 105 97 111 32 77 105 110 103 34 44 34 65 103 101 34 58 49 54 44 34 71 117 97 107 101 34 58 116 114 117 101 44 34 67 108 97 115 115 101 115 34 58 91 34 77 97 116 104 34 44 34 69 110 103 108 105 115 104 34 44 34 67 104 105 110 101 115 101 34 93 44 34 80 114 105 99 101 34 58 57 46 57 57 125]
{“Name”:“Xiao Ming”,“Age”:16,“Guake”:true,“Classes”:[“Math”,“English”,“Chinese”],“Price”:9.99}

show Student :
Name :
Age : 0
Guake : false
Price : 0
Classes :
Unmarshal success
show Student :
Name : Xiao Ming
Age : 16
Guake : true
Price : 9.99
Classes : Math English Chinese

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go语言的JSON 库 的相关文章

  • 一个简单的Golang实现的HTTP Proxy方法

    最近因为换了Mac 以前的Linux基本上不再使用了 但是我的SS代理还得用 SS代理大家都了解 一个很NB的socks代理工具 但是就是因为他是Socks的 想用HTTP代理的时候很不方便 以前在Linux下的时候 会安装一个Privox
  • Sublime Text 3配置Go语言开发环境

    Sublime Text 3配置Go语言开发环境 1 Go语言环境搭建 2 GoSublime安装和配置 2 1 安装步骤 2 2 代码开发 2 3 编译运行 1 Go语言环境搭建 本篇博文是在读者Go自身环境已经搭好 Sublime Te
  • 开源Go语言数值算法库 An open numerical library purely based on Go programming language

    目录 关于 goNum https github com chfenger goNum 安装环境 安装方法 算法 许可证书 致谢 关于goNum goNum是一款完全以Go语言为基础的开源数值算法库 它可以使你像调用其它go函数一样使用其进
  • 玩好go的切片

    go的slice 入门就会遇到 但这个东西大多数人都是停留在简单的使用 一些干了好几年的老程序员都说不明白里面的道道 这里面坑不少 恰巧今天有空 好好整理下 永不踩坑 1 为什么要用切片 其他语言大多用的都是数组 在go中 数组的长度是不可
  • Go语言学习19-样本测试

    样本测试 引言 样本测试 1 编写样本测试函数 2 样本测试的运行 3 样本测试函数的命名 结语 引言 上一篇笔者介绍了 Go 语言的 基准测试 其实在测试源码文件中还可以添加样本测试函数 但编写样本测试函数不需要使用 testing 代码
  • Go 语言运行时环境变量快速导览

    原文 http dave cheney net 2015 11 29 a whirlwind tour of gos runtime environment variables Go 语言运行时环境变量快速导览 介绍 Go Runtime除
  • go语言的常见函数

    1 make函数 创建数组切片 Go语言提供的内置函数make 可以用于灵活地创建数组切片 创建一个初始元素个数为5的数组切片 元素初始值为0 mySlice1 make int 5 创建一个初始元素个数为5的数组切片 元素初始值为0 并预
  • error An unexpected error occurred: “https://registry.yarnpkg.com/axios: con 解决方案

    error An unexpected error occurred https registry yarnpkg com axios con 今天用在跑一个项目的时候发现了这个错误 看着像是网络连接不上 发现这里是用的Dokcerfile
  • golang数据结构初探之动态数组slice

    动态数组slice slice 又称动态数组 依托于数组实现 可以方便的进行扩容和传递 实际使用时比数组更灵活 但正是因为灵活 实际使用时更容易出错 避免出错的最好方法便是了解其实现原理 特性速览 初始化 声明和初始化切片的方式主要有以下几
  • Go Web编程实战(2)----流程控制语句

    目录 流程控制语句 if else语句 for循环语句 用for循环实现do while 用for循环实现while break指定跳出循环 continue语句 for range循环 遍历数组 遍历字符串 遍历map 遍历通道 chan
  • 学习笔记(02):go快速入门-iota用法

    立即学习 https edu csdn net course play 26897 344142 utm source blogtoedu
  • 理解golang调度

    线程模型 在细说 Go 的调度模型之前 先来说说一般意义的线程模型 线程模型一般分三种 由用户级线程和 OS 线程的不同对应关系决定的 N 1 即全部用户线程都映射到一个OS线程上 上下文切换成本最低 但无法利用多核资源 1 1 一个用户线
  • Go语言学习-基本

    命名 如果是在函数外部定义 那么将在当前包的所有文件中都可以访问 名字的开头字母的大小写决定了名字在包外的可见性 如果一个名字是大写字母开头的 译注 必须是在函数外部定义的包级名字 包级函数名本身也是包级名字 那么它将是导出的 也就是说可以
  • Eclipse 导入Go项目

    用Eclipse开发Java的程序员 一想到导入项目 首先是Import 但是发现点击import后 导入不了go项目 所以采用新建的方式来导入Go项目 这个前提是要搭建好Eclipse中Go开发环境 这些有很多可以百度 这里只描述Go项目
  • 解决GO语言编译程序在openwrt(mipsle架构)上运行提示Illegal instruction问题

    RT 最近在研究openwrt mipsle架构 上运行go语言编译出来的程序 一运行就报 Illegal instruction 这样的错误 百度和Google搜索了一遍 得出两种解决方案 PS 更新一遍 当时写这个文档的时候没有发现Go
  • go语言RSA加密算法(一):生成密钥对

    生成密钥对 分别存储到公钥文件 files public pem 私钥文件中 files private pem package main import crypto rand crypto rsa crypto x509 encoding
  • Go设置国内源

    Go设置国内源 如果你需要Beego这个框架 正常来说你需要安装Git之后go get不会报错 但由于网络问题 go get会非常慢 以至于没法使用 这个时候我们需要需要国内源来进行加速 首先需要我们开启Go的MODULL支持 SETX G
  • Go Web编程实战(3)----数据类型

    目录 前言 布尔型 数字类型 字符串类型 使用 byte修改 使用 rune修改 指针类型 指针的简单用法 修改指针值 复合类型 数组类型 结构体介绍 切片类型 从指定范围生成切片 重置切片 直接声明切片 Map 前言 Go语言数据类型包括
  • go语言教程哪里有?go 语言优秀开源项目汇总

    目录 监控系统 容器技术 PaaS工具 大数据 微服务 CI CD 数据库技术 存储技术 分布式系统 消息系统 服务器管理 安全工具 网络工具 Web工具 Web框架 区块链技术 其它 监控系统 项目 简介 OpenFalcon OpenF
  • Go语言学习路线

    gogogo git 地址 Go 学习 学习路线 2 基础知识 3 开发工具安装地址 下载 Go基础知识 链接为gitee地址 放心查看 基础结构 learn1 go 基础语法 learn2 go 数据类型 learn3 go 变量 lea

随机推荐

  • 混淆工具javascript-obfuscator使用简介

    javascript obfuscator是一个免费的JavaScript代码混淆工具 它功能强大 可以把你的源代码变得 面目全非 完全没有可读性 还具有部分防调试功能 给JavaScript代码多一层保护 安装 它支持很多流行的前端打包工
  • 算法基础14 —— 图论入门之迪杰斯特拉算法(Dijkstra)

    回顾 Floyed算法可以求任意两点之间的最短路径 但是Dijkstra算法只能求一个结点到另一个结点的最短路径 它是一个单源的最短路径算法 Floyed算法的时间复杂度为O n 3 故一般情况下数据范围要求在100以内 Dijkstra算
  • 深度学习:神经网络中为什么需要使用激活函数?(超详细)

    一 百度百科 我们先看下百度百科的解释 如果不用激活函数 每一层输出都是上层输入的线性函数 无论神经网络有多少层 输出都是输入的线性组合 这种情况就是最原始的感知机 Perceptron 如果使用的话 激活函数给神经元引入了非线性因素 使得
  • 【GitHub教程】 GitHub上传自己的项目

    GitHub教程 GitHub上传自己的项目 1 首先安装git 安装git后才能上传项目 下载地址 https git scm com download win 进入直接检测电脑型号并下载 下载好后一直下一步安装即可 以下表示安装成功 2
  • IntelliJ IDEA Junit

    为了学习最新计算机知识 我决定用英语写文档 并多看英文文档 today It take me lots of time to find how to make TestCase in IntelliJ7 You could follow t
  • IntelliJ IDEA 2020.2 配置大全(更新中)

    文章目录 1 提示改为不区分大小写 2 代码字体大小修改 2 1使用Ctrl 鼠标滚轮修改代码字体大小 2 2常规方法修改代码字体大小 行距 3 主题设置 4 控制台输出字体大小修改 5 Maven配置 6 打开IDEA直接进入上次退出的项
  • Set 数据构造函数

    Set数据结构 类似数组 所有的数据都是唯一的 没有重复的值 它本身是一个构造函数 主要是用来去重 但是必须转成真数组 我们来学习以下转真数组的两种方法 第一种 Array from 第二种 拓展运算符 利用拓展运算符把 set 集合将字符
  • FatMouse' Trade(贪心算法)

    FatMouse Trade Time Limit 2000 1000 MS Java Others Memory Limit 65536 32768 K Java Others Total Submission s 45918 Accep
  • 案例驱动python编程入门-python监听socket客户端连接(驱动串口屏幕)

    实例简介 实例截图 核心代码 import socket import os import sys import struct def socket service data try s socket socket socket AF IN
  • 轨迹规划五次多项式学习

    五次多项式是一种常用的平滑轨迹规划方法 可以在运动过程中使得机器人的加速度和曲率连续变化 以达到平滑 稳定控制的效果 这里简单介绍如何通过五次多项式来求解运动轨迹 假设我们要将一个物体从起始点 x0 y0 运动到终止点 xT yT 并且要求
  • React框架(十九)在使用style-components的同时引入.css文件

    什么是style components style components是针对React写的一套css in js框架 简单来讲就是在js中写css 相对于与预处理器 sass less 的好处是 css in js使用的是js语法 不用重
  • 小程序-云开发

    小程序 云开发 小程序 云开发 小程序 云开发 什么是小程序云开发 云开发优势 能力概览 配置环境开发 准备工作 第 1 步 创建项目 第 2 步 开通云开发 第 3 步 开始开发 第三方快速注册的小程序 第三方快速注册小程序支持云开发 方
  • Leetcode 485最大连续1的个数

    题目描述 方法 暴力求解 自己想到的思路就是遍历一遍 创建一个新的vector和记录最大值的v max 将等于1的放入新vector中 然后比较新容器大小和v max 如果大于就记录下最大的新容器大小 目的是记录最大的长度 改进 将新数组换
  • Qt5解决中文乱码问题

    Qt5中解决运行时中文乱码 中文乱码问题 中文乱码问题 代码中字符串正常显示 运行时显示乱码 解决方法有如下三种方法 第一种方法 this gt setWindowTitle QString fromLocal8Bit 中文乱码问题 ui
  • 【Web3】认识以太坊钱包

    目录 区块链钱包概念 密码 私钥 Private Key 公钥Public Key Keystore 助记词 Mnemonic 如何解锁账户 区块链钱包概念 钱包用来存钱的 在区块链中 我们的数字资产都会对应到一个账户地址上 只有拥 有账户
  • Neural ODE 神经常微分方程

    Neural ODE ODE常微分方程 欧拉法求解 欧拉法求解过程是一个递归的过程 这个思想和牛顿法 梯度下降法是相似的 并且它将函数离散化 分割成一个个小段来求解 欧拉法求解的常微分方程的形式通常为 图片来自知乎Neural ODE 这个
  • 如何在R语言中找到统计值最小所在的分组

    如何在R语言中找到统计值最小所在的分组 介绍 在数据分析和统计中 我们经常需要找到某个统计值在不同分组中的最小值所在的组别 在R语言中 我们可以使用一些函数和技巧来实现这个目标 本文将介绍如何使用R语言找到统计值最小所在的分组 并提供相应的
  • 算法讲解:二分图匹配【图论】

    二分图匹配 自然要先从定义入手 那么二分图是什么呢 二分图 二分图又称作二部图 是图论中的一种特殊模型 设G V E 是一个无向图 如果顶点V可分割为两个互不相交的子集 A B 并且图中的每条边 i j 所关联的两个顶点i和j分别属于这两个
  • 前端工程师必须收藏的 JavaScript 资源大全

    我想很多程序员应该记得 GitHub 上有一个 Awesome XXX 系列的资源整理 awesome javascript 是 sorrycc 发起维护的 JS 资源列表 内容包括 包管理器 加载器 测试框架 运行器 QA MVC框架和库
  • Go语言的JSON 库

    1 Go语言的JSON 库 Go语言自带的JSON转换库为 encoding json 1 1 其中把对象转换为JSON的方法 函数 为 json Marshal 其函数原型如下 func Marshal v interface byte