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

golang JSON序列化

JSON

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。

json历史

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nsDku8I3-1722343372360)(https://i-blog.csdnimg.cn/direct/46affa558eeb4022b1508f014c7a6e03.png#pic_center)]

JSON建构于两种结构

  • “键/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)
  • 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)

1.JSON对象

一个JSON对象是一个无序的键/值对集合,它以左花括号 { 开始,以右花括号 } 结束。每个键值对包含一个键和一个值,键和值之间用冒号 : 分隔,键值对之间用逗号 , 分隔。键必须是字符串,而值可以是字符串、数字、另一个JSON对象、数组、布尔值或 null

img

结构示例:

{"key1": "value1","key2": 123,"key3": true, "key4": null, "key5": { "nestedKey1": "nestedValue1"  }, "key6": ["element1", "element2", "element3"]}

反序列化后:

{"key1": "value1","key2": 123,"key3": true,"key4": null,"key5": {"nestedKey1": "nestedValue1"},"key6": ["element1","element2","element3"]
}

2.JSON数组

一个JSON数组是一个有序的值集合,它以左方括号 [ 开始,以右方括号 ] 结束。数组中的元素可以是字符串、数字、布尔值、null、另一个JSON对象或数组,元素之间用逗号 , 分隔

img

结构示例

[ "value1",123, true,null, {"key1": "value1" },["nestedElement1", "nestedElement2"]]

反序列化后

["value1",123,true,null,{"key1": "value1"},["nestedElement1","nestedElement2"]
]

JSON的嵌套结构

JSON对象和数组可以相互嵌套,形成更复杂的数据结构

示例

{"name": "张三","age": 30,"isStudent": false,"address": {"street": "科技路","city": "北京","postalCode": "100000"},"phoneNumbers": [{"type": "home","number": "123-456-7890"},{"type": "work","number": "987-654-3210"}]}

反序列化后

{"name": "张三","age": 30,"isStudent": false,"address": {"street": "科技路","city": "北京","postalCode": "100000"},"phoneNumbers": [{"type": "home","number": "123-456-7890"},{"type": "work","number": "987-654-3210"}]
}

JSON的语法规则

  • 使用UTF-8编码。
  • 数据以键值对的形式出现。
  • 键值对之间用逗号分隔。
  • 对象由花括号 {} 包围,键值对由逗号 , 分隔。
  • 数组由方括号 [] 包围,元素之间由逗号 , 分隔。
  • 字符串必须用双引号 " 包围,特殊字符需要转义。
  • 数字可以是整数或浮点数,但不能有前导零。
  • 布尔值可以是 truefalse
  • null 表示空值。
  • 对象和数组可以嵌套使用。
  • 没有注释。
  • 键必须是双引号包围的字符串。
  • 值可以是字符串、数字、布尔值、null、对象或数组。

Go语言json序列化

在Go语言中,序列化(Serialization)是将内存中的数据结构转换为可存储或传输的格式,如JSON、XML、Protocol Buffers等。反序列化(Deserialization)则是将存储或传输的格式转换回内存中的数据结构。Go语言标准库中的encoding/json包提供了JSON序列化的功能。

1.func Marshal

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

Marshal函数返回v的json编码。

Marshal函数会递归的处理值。如果一个值实现了Marshaler接口切非nil指针,会调用其MarshalJSON方法来生成json编码。nil指针异常并不是严格必需的,但会模拟与UnmarshalJSON的行为类似的必需的异常。

  • v:这是一个空接口,它代表了你要序列化的Go语言数据结构。使用空接口作为形参使得该函数可接受任何类型的值
  • []byte:这是一个字节切片,它包含了序列化后的JSON格式的数据。这是Marshal函数的主要输出,表示序列化后的数据。
  • error:这是一个可能的错误值。如果序列化过程成功,error将被设置为nil;如果序列化过程中发生错误,error将包含错误信息。

例子

package main
import ("encoding/json""fmt"
)
type Person struct {Name  string `json:"name"`Age   int    `json:"age"`Email string `json:"email"`
}
func main() {person := Person{Name:  "张三",Age:   30,Email: "zhangsan@example.com",}// 将结构体序列化为JSON格式的字节切片data, err := json.Marshal(person)if err != nil {fmt.Println("序列化失败:", err)return}// 将字节切片转换为字符串以打印fmt.Println(string(data))
}

输出结果

{"name":"张三","age":30,"email":"zhangsan@example.com"}

2.func MarshalIndent

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

MarshalIndent类似Marshal但会使用缩进将输出格式化。

  • v:这是一个空接口,它代表了你要序列化的Go语言数据结构。使用空接口作为形参使得该函数可接受任何类型的值
  • prefix:一个字符串,它将作为每个JSON键的前缀。默认值为空字符串,表示不添加前缀
  • indent:一个字符串,它将作为缩进字符串。默认值为空字符串,表示不添加缩进
  • []byte:这是一个字节切片,它包含了序列化后的JSON格式的数据。这是Marshal函数的主要输出,表示序列化后的数据。
  • error:这是一个可能的错误值。如果序列化过程成功,error将被设置为nil;如果序列化过程中发生错误,error将包含错误信息。

示例:

package mainimport ("encoding/json""fmt"
)type Person struct {Name  string `json:"name"`Age   int    `json:"age"`Email string `json:"email"`
}func main() {person := Person{Name:  "张三",Age:   30,Email: "zhangsan@example.com",}// 将结构体序列化为JSON格式的字节切片,并添加缩进data, err := json.MarshalIndent(person, "", "    ")if err != nil {fmt.Println("序列化失败:", err)return}// 将字节切片转换为字符串以打印fmt.Println(string(data))
}

结果:

{"name": "张三","age": 30,"email": "zhangsan@example.com"
}

Go语言反序列化

Go语言中的反序列化是将JSON格式的字符串转换回Go语言的数据结构。使用encoding/json包来完成这个过程

函数:

func Unmarshal

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

Unmarshal函数解析json编码的数据并将结果存入v指向的值。

  • data:这是一个字节切片,它包含了JSON格式的数据。这是Unmarshal函数的输入,表示要反序列化的数据。
  • v:这是一个接口值,它代表了你要反序列化的Go语言数据结构。使用空接口作为形参使得该函数可接受任何类型的值
  • 返回值:一个可能的错误值。如果反序列化过程成功,error将被设置为nil;如果反序列化过程中发生错误,error将包含错误信息。

示例

package main
import ("encoding/json""fmt"
)
type Person struct {Name  string `json:"name"`Age   int    `json:"age"`Email string `json:"email"`
}
func main() {// 假设我们有一个JSON格式的字符串jsonString := `{"name":"李四","age":25,"email":"lisi@example.com"}`// 将JSON字符串反序列化为Go语言中的结构体var person Personerr := json.Unmarshal([]byte(jsonString), &person)if err != nil {fmt.Println("反序列化失败:", err)return}// 输出反序列化后的结构体fmt.Printf("Name: %s, Age: %d, Email: %s\n", person.Name, person.Age, person.Email)
}

输出结果

Name: 李四, Age: 25, Email: lisi@example.com

这样,你就完成了Go语言中的序列化和反序列化操作。这些操作在处理网络请求、文件存储和数据传输时非常有用。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Unity2D 2022:UI】TextMeshPro组件无法显示中文
  • Spring Boot中的 6 种API请求参数读取方式
  • 核心线程创建之后是否受keepAliveTime影响?
  • SRv6 和IGP/BGP协议区别
  • 自制熊猫烧香进阶
  • centos安装python 3.9
  • 【diffusers极速入门(五)】扩散模型中的 Scheduler(noise_scheduler)的作用是什么?
  • react函数学习——useState函数
  • 51单片机嵌入式开发:22、STC89C52R控制 实现单总线温度传感器DS18b20的温度读取
  • UltraEdit v27文本代码程序编辑器免费版下载安装教程(亲测可用)
  • Java每日一练,技术成长不间断
  • 第十章 计算机网络——应用层
  • 递归求数组和
  • vscode+cmake+msvc+vcpkg的入门使用
  • C++设计模式笔记(内附可运行代码示例)
  • HashMap ConcurrentHashMap
  • HTTP中的ETag在移动客户端的应用
  • input实现文字超出省略号功能
  • JDK 6和JDK 7中的substring()方法
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • JS数组方法汇总
  • js中的正则表达式入门
  • Python连接Oracle
  • Spring Boot MyBatis配置多种数据库
  • TypeScript迭代器
  • vue的全局变量和全局拦截请求器
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 创建一种深思熟虑的文化
  • 搭建gitbook 和 访问权限认证
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 盘点那些不知名却常用的 Git 操作
  • 时间复杂度与空间复杂度分析
  • 学习ES6 变量的解构赋值
  • 赢得Docker挑战最佳实践
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • MPAndroidChart 教程:Y轴 YAxis
  • 如何在招聘中考核.NET架构师
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​configparser --- 配置文件解析器​
  • !!Dom4j 学习笔记
  • (C++17) optional的使用
  • (Oracle)SQL优化技巧(一):分页查询
  • (ZT)薛涌:谈贫说富
  • (安卓)跳转应用市场APP详情页的方式
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (三)c52学习之旅-点亮LED灯
  • (原創) 未来三学期想要修的课 (日記)
  • (转)3D模板阴影原理
  • (转)visual stdio 书签功能介绍
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .Net Core 微服务之Consul(二)-集群搭建
  • .Net8 Blazor 尝鲜