golang JSON序列化

news2024/11/27 18:46:34

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 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.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 Person
	err := 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.coloradmin.cn/o/1961851.html

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

相关文章

080基于ssm+vue的大学生兼职信息系统

开发语言:Java框架:ssmJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.…

获客工具大揭秘:为何它能让获客如此轻松?

你是不是也觉得,现在的市场环境,获客越来越难了? 今天我要给大家分享一个实用且高效的获客工具,它简直是营销界的福音! 1、关键词搜索 关键词搜索功能是获客工具的基础,也是其重要性不可小觑的原因。 这…

【数据中台】大数据管理平台建设方案(原件资料)

建设大数据管理中台,按照统一的数据规范和标准体系,构建统一数据采集﹣治理﹣共享标准、统一技术开发体系、统一接口 API ,实现数据采集、平台治理,业务应用三层解耦,并按照统一标准格式提供高效的…

LabVIEW发电机控制器自动测试系统

随着飞机电源系统对自动化与精确控制需求的提高,开发了一套基于LabVIEW和NI PXI硬件平台的飞机发电机控制器测试系统。该系统利用先进的测试技术,实现对飞机发电机控制器的自动测试,显著提升测试的效率、精度和一致性。 项目背景 飞机发电机…

nginx反向代理+nginx黑白名单+nginx负载均衡+平滑升级+配置jdk环境-7.30

一、反向代理 1.前端服务器配置 前端服务器:用于接收和响应客户端,代理另一台主机 Nginx 安装 (1).下载安装nginx [rootweb ~]# wget https://nginx.org/download/nginx-1.26.1.tar.gz (2).解压 [rootweb ~ ]# tar -zxvf nginx-1.26.1.tar.gz (3…

《从零开始做个摸鱼小网站! · 序》灵感来源

序 大家好呀,我是summo,这次来写写我在上班空闲(摸鱼)的时候做的一个小网站的事。去年阿里云不是推出了个活动嘛,2核2G的云服务器一年只要99块钱,懂行的人应该知道这个价格在业界已经是非常良心了,虽然优惠只有一年&a…

【论文共读】【翻译】【CGAN】【Conditional Gernerative Adversarial Networks】

论文地址:https://arxiv.org/pdf/1411.1784 翻译: Conditional Gernerative Adversarial Networks 条件生成对抗网络 0. 摘要 生成对抗网络[8]最近被引入,作为一种训练生成模型的新方法。在这项工作中,我们引入了生成对抗网络的…

同步与异步,阻塞与非阻塞的深入分析

😎 作者介绍:欢迎来到我的主页👈,我是程序员行者孙,一个热爱分享技术的制能工人。计算机本硕,人工制能研究生。公众号:AI Sun(领取大厂面经等资料),欢迎加我的…

人在迷茫无聊时该干什么?

做两件事,收和放。 第一件事收,全面收缩。 迷茫不是无事可做,而是所做的事没有意义,没有意义就停掉,空出时间让身心恢复到正常状态。迷茫会让你焦虑,让你晚睡,让你狂吃,让你迫不及待…

公司里的IT是什么?

公司里的IT是什么? 文章目录 公司里的IT是什么?1、公司里的IT2、IT技术3、IT行业4、IT行业常见证书 如果对你有帮助,就点赞收藏把!(。・ω・。)ノ♡ 前段时间,在公…

ARMv8 内存属性

目录 普通内存 (normal memory)设备内存(device memory)arm64 mair_el1 系统寄存器及linux 对其配置页表中的内存属性总结 普通内存 (normal memory) 弱一致性(weakly ordered)。 存在分支预测,数据预取,高速缓存行预…

二分算法及其公式

二分查找 二分查找是大多数人第一个接触到的算法,很多人都认为只有有序的数组可以使用二分查找,但这种思想其实是错误的,二分查找是可以用于拥有二段性的数组,而且二分算法是由模板做参考的,所以只要掌握就可以解决大…

【区块链+绿色低碳】基于区块链的双碳能源纳管平台 | FISCO BCOS应用案例

在双碳战略的指导下,南京区块链产业应用协会牵头研发的双碳能源纳管平台,依托区块链、人工智能、云计算、 物联网、大数据、工业互联网与边缘计算等技术,对绿电追溯、需求侧响应、能源微网、源网荷储、隔墙用电、 碳排放权认证、额度计量、预…

矩阵常见分解算法及其在SLAM中的应用

文章目录 常见特殊矩阵定义Cholesky分解(正定Hermittian矩阵,分解结果唯一)Cholesky分解应用 SVD分解(将singularvalues排序后分解唯一)SVD 分解的应用(任意矩阵) QR分解(任意矩阵&a…

第六周:机器学习周报

机器学习周报 摘要Abstract机器学习——类神经网络训练不起来怎么办?1. 自动调整学习率(learning rate)1.1 特制化的Learning Rate——parameter dependent1.1.1 Root Mean Square(RMS,均方根)1.1.2 RMSPro…

【Python】基础语法(下)

本篇文章将接着上篇文章继续讲解基础语法: (4)变量 (5)注释 (6)输入 (7)条件语句 四:变量 变量其实就是我们生活中起别名和外号。让变量名指向某个值&a…

旅游卡,免费,旅游是真的吗?真相是……

但这种包来回大交通,一旦成本大于利润,他们就会以各种理由推卸责任。这就是我在“揭秘:共享旅游卡免费旅游,包来回路费,这背后的3大真相!”这篇文章里面讲到那个大妈的惨痛教训。 以上这5点真相&#xff0…

Python 中的@符号:如何用装饰器改变你的编程方式?

Python 是一种强大且灵活的编程语言,其中有许多独特的语法元素和概念。 符号通常用于装饰器。它看起来可能有些神秘,但实际上它的工作原理非常简单。 什么是装饰器? 在了解 符号之前,我们首先需要理解什么是装饰器。简单来说&am…

C++设计模式笔记(内附可运行代码示例)

持续更新, 欢迎关注....... 前言 设计目的 高内聚,低耦合 设计原则 1、开放封闭原则 类的改动是通过增加代码进行,而不是修改源代码。 2、单一职责原则 职责单一,对外只提供一种功能,引起类变化的原因都应该只有一个。 3…

【中项】系统集成项目管理工程师-第9章 项目管理概论-9.1PMBOK的发展与9.2项目基本要素

前言:系统集成项目管理工程师专业,现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试,全称为“全国计算机与软件专业技术资格(水平)考试”&…