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语言中的序列化和反序列化操作。这些操作在处理网络请求、文件存储和数据传输时非常有用。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

看不见的硝烟:中国网络安全三十年沉浮史

2022 年 5 月 16 日,俄罗斯黑客组织 KillNet 向包括美国、英国、德国在内 10 个国家的政府正式 “宣战”。 2022 年 4 月 28 日,一则消息刷屏,北京健康宝在使用高峰期间,遭受到境外网络攻击。北京健康宝保障团队进行了及时有效应…

4G/5G无线视频采集设备如何通过国标28181接入到视频监控接入平台(视频统一接入平台)

目录 一、国标GB/T 28181介绍 1、国标GB/T28181 2、内容和特点 二、4G/5G无线视频采集设备 1、定义 2、主要功能: 3、技术特点 4、应用场景 二、接入准备工作 1、确定网络环境 (1)公网接入 (2)专网传输 2、…

一款功能强大的免费开源卸载工具

BCUninstaller,也称为Bulk Crap Uninstaller(简称BCU),是一款免费且开源的Windows平台专用程序卸载工具。它的主要功能是帮助用户高效地批量卸载不需要的应用程序和组件,从而优化系统性能。 BCUninstaller功能特点 批…

这本vue3编译原理开源电子书,初中级前端竟然都能看懂

前言 众所周知vue提供了很多黑魔法,比如单文件组件(SFC)、指令、宏函数、css scoped等。这些都是vue提供的开箱即用的功能,大家平时用这些黑魔法的时候有没有疑惑过一些疑问呢。 我们每天写的vue代码一般都是写在*.vue文件中,但是浏览器却只…

【大厂笔试】翻转、平衡、对称二叉树,最大深度、判断两棵树是否相等、另一棵树的子树

检查两棵树是否相同 100. 相同的树 - 力扣(LeetCode) 思路解透 两个根节点一个为空一个不为空的话,这两棵树就一定不一样了若两个跟节点都为空,则这两棵树一样当两个节点都不为空时: 若两个根节点的值不相同&#xff…

【数据结构】了解哈希表,解决哈希冲突,用Java模拟实现哈希桶

哈希表的概念 哈希表(Hash Table)是一种高效的数据结构,用于实现快速的数据存储和检索。它通过将数据映射到一个数组的索引位置,从而能够在平均情况下实现O(1)的时间复杂度进行查找、插入和删除操作。 哈希表的基本概念包括以下…

java面向对象重点总结

文章目录 java面向对象重点总结类与实例构造方法方法重载属性与修饰符封装继承多态重构抽象类接口抽象类和接口的区别:集合泛型 java面向对象重点总结 对象是一个自包含的实体,用一组可识别的特性和行为来标识。 面向对象编程,英文叫Object…

flink 1.17 测试

1、配置 2、测试: ./bin/flink run-application -t yarn-application -Dyarn.application.namewordcount -c org.apache.flink.streaming.examples.wordcount.WordCount ./examples/streaming/WordCount.jar --input hdfs://jy/tmp/input --output hdfs://jy/tmp/o…

C++学习:C++是如何运行的

C 是一种强类型的编程语言,支持面向对象、泛型和低级内存操作。它的工作机制包括从编写源代码到生成可执行文件的一系列步骤。C与文件无关,文件只是容纳运行内容的载体,需要对文件以目标系统的规则编译后,才能在目标系统中运行。 …

java算法递归算法练习-数组之和

简单找个题目练习一下递归算法,输入一组数组,使用递归的方法计算数组之和。其实这个题目,用循环的方式也很简单就能解决,直接循环遍历一下相加就行了,但是我们用来练习一下递归。 先来找基线条件和递归条件 基线条件…

springboot+webSocket对接chatgpt

webSocket对接参考 话不多说直接上代码 WebSocket package com.student.config;import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.springframework.http.MediaType; import org.springfram…

matplotLib在图中标出最后一个点的值

import matplotlib.pyplot as plt import numpy as np# 生成100个随机数据 data np.random.rand(100)# 绘制数据 plt.plot(data, labelData Points)# 获取最后一个数据点的位置和值 last_x len(data) - 1 last_y data[-1]# 用红圈标出最后一个点 plt.plot(last_x, last_y, r…

STM32-寄存器DMA配置指南

配置步骤 在STM32F0xx中文参考手册中的DMA部分在开头给出了配置步骤 每个通道都可以在外设寄存器固定地址和存储器地址之间执行 DMA 传输。DMA 传输的数据 量是可编程的,最大达到 65535。每次传输之后相应的计数寄存器都做一次递减操作,直到 计数为&am…

jdk环境、tomcat环境

回顾复习 安装nodejs,和jdk一样的软件运行环境 yum -y list installed|grep epel #是否安装epel yum -y install nodejs node -v #查看版本号 下载对应的nodejs软件npm yum -y install npm npm -v #查 npm set config ....淘宝镜像 安装vue/cli…

[ACTF2020 新生赛]BackupFile1

打开题目 利用disearch扫描&#xff0c;发现源文件index.php.bak 下载下来 打开文件 代码审计&#xff0c;翻译一下 翻译代码为&#xff1a; <?php include_once "flag.php"; //这一行使用 include_once 函数来包含&#xff08;或插入&#xff09;另一个 PHP …

Win11系统文件资源管理器鼠标右键卡顿解决方法

引用链接&#xff1a; Windows 11文件资源管理器崩溃怎么解决&#xff1f;看看这7个解决办法&#xff01;

Redis的集群 高可用

文章目录 Redis基本概念主从复制哨兵模式故障切换集群 Redis基本概念 Redis集群三种模式 主从复制&#xff1a;奇数台 3&#xff1a; 一主两从 哨兵模式&#xff1a;3&#xff1a; 1主两从 cluster&#xff1a;6 主从复制&#xff1a;和mysql的主从复制类似&#xff0c;主…

C++ string类

目录 为什么要有string类&#xff1f; auto和范围for 1. auto 2. 范围for 一. 标准库中string类的简单使用 二. string类的常用接口说明 1. string类对象的常见构造 2. string类对象的容量操作 3. string类对象的访问及遍历操作 4. string类对象的修改与查找操作 插入…

【Web 前端开发】vue3开发环境部署

1、安装 Node.js 和 npm 访问 Node.js 官网 下载并安装最新的 LTS 版本。 安装完成后&#xff0c;打开命令行工具&#xff0c; 输入 node -v 和 npm -v 检查安装是否成功。 node -vnpm -v 如下图&#xff1a; 2、安装 Vue CLI 在命令行工具中输入以下命令安装 Vue CLI&…

微信小程序开发:宿主环境—组件

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…