结构体和 Json 相互转换(序列化反序列化)

关于 JSON 数据

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也
易于机器解析和生成。RESTfull Api 接口中返回的数据都是 json 数据。

Json 的基本格式如下:

{
"a": "Hello",
"b": "World"
}
稍微复杂点的 JSON

 

 结构体与 JSON 序列化

注意一个点:结构体内的私有属性不能被json包访问,如果结构体内部的属性都要就行转换,需要全部为公有属性(开头字符大写)
比如我们 Golang 要给 App 或者小程序提供 Api 接口数据,这个时候就需要涉及到结构体和
Json 之间的相互转换。
Golang JSON 序列化 是指把结构体数据转化成 JSON 格式的字符串;
(结构体 ----> JSON格式字符串)
Golang JSON 的反序列化 是指把 JSON 数据转化成 Golang 中的结构体对象。
(JSON格式字符串 ----> 结构体)

Golang 中 的 序 列 化 和 反 序 列 化 主 要 通 过 "encoding/json" 包 中 的 json.Marshal() json.Unmarshal()方法实现;

结构体对象转化成 Json 字符串

package mainimport ("encoding/json""fmt"
)type Person struct{Name	stringGender	stringAge 	int
}func main() {var p1 = Person{Name: "奥特曼",Gender: "男",Age: 17,}fmt.Printf("%#v\n",p1)jsonByte,_ := json.Marshal(p1)jsonStr := string(jsonByte)fmt.Printf("%#v", jsonStr)}

 错误案例如下:

package mainimport ("encoding/json""fmt"
)type Person struct{Name	stringGender	stringage 	int
}func main() {var p1 = Person{Name: "奥特曼",Gender: "男",age: 17,}fmt.Printf("%#v\n",p1)jsonByte,_ := json.Marshal(p1)jsonStr := string(jsonByte)fmt.Printf("%#v", jsonStr)}

 Json 字符串转换成结构体对象

返回一个err;

如果err为空,转换成功;

err非空,转换失败

package mainimport ("encoding/json""fmt"
)type Person struct{Name	stringGender	stringage 	int
}func main() {var str = `{"Name":"奥特曼","Gender":"男","Age":17}`var p2 Personerr := json.Unmarshal([]byte(str), &p2)if err != nil {  fmt.Println(err)}fmt.Printf("%#v\n", p2)fmt.Println(p2.Name)}

 结构体标签 Tag

Tag 是结构体的元信息,可以在运行的时候通过反射的机制读取出来。
Tag 在结构体字段的后方定义,由一对反引号包裹起来,具体的格式如下:
`key1:"value1" key2:"value2"`
结构体 tag 由一个或多个键值对组成。键与值使用冒号分隔,值用双引号括起来。
同一个结构体字段可以设置多个键值对 tag,不同的键值对之间使用空格分隔。
注意事项: 为结构体编写 Tag 时,必须严格遵守键值对的规则。
结构体标签的解析代码的容错能力很差,一旦格式写错,编译和运行时都不会提示任何错误,通过反射也无法正确取值。
例如不要在 key 和 value 之间添加空格。

 通过指定 tag 实现 json 序列化该字段时的 key

嵌套结构体和 JSON 序列化反序列化 

package mainimport ("encoding/json""fmt"
)
type Person struct{Name	string `json:"name"`Gender	string `json:"gender"`Age 	int		`json:"age"`	
}type Group struct{Intrasting stringPerson []Person
}
func main() {h := Group{Intrasting: "绘画",Person: make([]Person, 0),}for i := 17; i < 20; i++ {p := Person{Name :fmt.Sprintf("编号%v", i),  //字符串类型Gender:"男",Age : i+1,}h.Person = append(h.Person, p) //将P里的东西,添加到实例化的h后的切片内}// fmt.Println(c)strByte, err := json.Marshal(h)if err != nil {fmt.Println(err)} else {strJson := string(strByte)fmt.Println(strJson)}
}

 逆序退回

package mainimport ("encoding/json""fmt"
)type Person struct{Name	string `json:"name"`Gender	string `json:"gender"`Age 	int		`json:"age"`	
}type Group struct{Intrasting stringPerson []Person
}func main() {jsonStr := `{"Intrasting":"绘画","Person":[{"name":"编号17","gender":"男","age":18},{"name":"编号18","gender":"男","age":19},{"name":"编号19","gender":"男","age":20}]}`var h = &Group{}err := json.Unmarshal([]byte(jsonStr), h)if err != nil {fmt.Println(err)} else {fmt.Printf("%#v\n", h)fmt.Printf("%v", h.Intrasting)}
}

 

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

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

相关文章

如何申请中国境内提供金融信息服务业务许可

依据《外国机构在中国境内提供金融信息服务管理规定》《外国机构在中国境内提供金融信息服务申请许可说明》等政策&#xff0c;外国机构在中国境内提供金融信息服务业务许可要求如下&#xff1a; 金融信息服务定义 所称的外国机构&#xff0c;是指外国金融信息服务提供者。 …

java环境搭建 Ubuntu Linux

jdk的安装和配置环境变量 使用apt sudo apt install default-jdk若是安装成功了在终端输入java -version来查看是否安装成功 使用官网下载的jdk包 直接在百度上搜索jdk&#xff0c;选择图片这个 网址:jdk下载网址 若是arm就选择带有arm的&#xff0c;反之选择x64的&#…

go逆向符号恢复

前言 之前一直没怎么重视&#xff0c;结果发现每次遇到go的题都是一筹莫展&#xff0c;刷几道题练习一下吧 准备 go语言写的程序一般都被strip去掉符号了&#xff0c;而且ida没有相关的签名文件&#xff0c;没办法完成函数名的识别与字符串的定位&#xff0c;所以第一步通常…

【web逆向】全报文加密及其登录流程的分析案例

aHR0cHM6Ly9oZWFsdGguZWxkZXIuY2NiLmNvbS9zaWduX2luLw 涉及加密库jsencrypt 定位加密点 先看加密的请求和响应&#xff1a; 全局搜索加密字段jsondata&#xff0c;这种非特定参数的一般一搜一个准&#xff0c;搜到就是断点。起初下的断点没停住&#xff0c;转而从调用栈单步…

【机器学习1】什么是机器学习机器学习的重要性

什么是机器学习? 简而言之&#xff0c;机器学习就是训练机器去学习。 机器学习作为人工智能(Artificial Intelligence,AI)的一个分支&#xff0c;以其最基本的形式来使用算法通过从数据中获取知识来进行预测。 不同于人类通过分析大量数据手动推导规则和模型&#xff0c;机…

关系型数据库的设计

范式 关系 注意&#xff1a;根据阿里开发规范&#xff0c;不再设置数据库的外键&#xff0c;在应用层保证外键逻辑即可 数据库设计 1:1 1:n 设想学生-班级案例&#xff0c;若在班级中保存所有学生的主键&#xff0c;则表长不好预测&#xff0c;表的数据亢余。 所以是在多的…

【SCSS】网格布局中的动画

效果 index.html <!DOCTYPE html> <html><head><title> Document </title><link type"text/css" rel"styleSheet" href"index.css" /></head><body><div class"container">&l…

BigDecimal

文章目录 BigDecimal 的用处BigDecimal 的大小比较BigDecimal 保留几位小数BigDecimal 的使用注意事项总结 BigDecimal 的用处 《阿里巴巴Java开发手册》中提到&#xff1a;浮点数之间的等值判断&#xff0c;基本数据类型不能用来比较&#xff0c;包装数据类型不能用 equals 来…

机器学习04-数据理解之数据可视化-(基于Pima数据集)

什么是数据可视化? 数据可视化是指通过图表、图形、地图等视觉元素将数据呈现出来的过程。它是将抽象的、复杂的数据转化为直观、易于理解的视觉表达的一种方法。数据可视化的目的是帮助人们更好地理解数据&#xff0c;从中发现模式、趋势、关联和异常&#xff0c;从而作出更明…

Jmeter-获取接口响应头(Response headers)信息进行关联

文章目录 Jmeter-获取接口响应头&#xff08;Response headers&#xff09;信息进行关联使用正则表达式提取器将Set-Cookie的值提取出来在其余接口中关联该提取信息运行查看关联是否成功 Jmeter-获取接口响应头&#xff08;Response headers&#xff09;信息进行关联 获取某一…

MATLAB | 如何绘制这样的描边散点图?

part.-1 前前言 最近略忙可能更新的内容会比较简单&#xff0c;见谅哇&#xff0c;今日更新内容&#xff1a; part.0 前言 看到gzhBYtools科研笔记(推荐大家可以去瞅瞅&#xff0c;有很多有意思的图形的R语言复现&#xff01;&#xff01;)做了这样一张图&#xff1a; 感觉很…

【网络基础实战之路】设计网络划分的实战详解

系列文章传送门&#xff1a; 【网络基础实战之路】设计网络划分的实战详解 【网络基础实战之路】一文弄懂TCP的三次握手与四次断开 【网络基础实战之路】基于MGRE多点协议的实战详解 【网络基础实战之路】基于OSPF协议建立两个MGRE网络的实验详解 PS&#xff1a;本要求基于…

Spring Cloud +UniApp 智慧工地云平台源码,智能监控和AI分析系统,危大工程管理、视频监控管理、项目人员管理、绿色施工管理

一套智慧工地云平台源码&#xff0c;PC管理端APP端平板端可视化数据大屏端源码 智慧工地可视化系统利用物联网、人工智能、云计算、大数据、移动互联网等新一代信息技术&#xff0c;通过工地中台、三维建模服务、视频AI分析服务等技术支撑&#xff0c;实现智慧工地高精度动态仿…

字节编码学习

字节编码学习 文章目录 字节编码学习01_字节与ASCII码表02_每个国家都有独特的码表03_国际化UTF-804_编码本和解码本不一致&#xff0c;乱码 01_字节与ASCII码表 public class Demo01 {public static void main(String[] args) {// 计算机的底层全部都是字节 ---- ----// 一个…

Python自动化实战之使用Pytest进行API测试详解

概要 每次手动测试API都需要重复输入相同的数据&#xff0c;而且还需要跑多个测试用例&#xff0c;十分繁琐和无聊。那么&#xff0c;有没有一种方法可以让你更高效地测试API呢&#xff1f;Pytest自动化测试&#xff01;今天&#xff0c;小编将向你介绍如何使用Pytest进行API自…

SpringMVC请求和响应

目录 1、简介 2、数据响应方式 2.1、页面跳转 2.1.1、直接返回字符串 2.1.2、ModelAndView 2.1.3、request域 2.2、回写数据 2.2.1、直接返回字符串 2.2.2、返回对象或集合 3、获得请求数据 3.1、基本类型参数 3.2、获得POJO类型参数 3.3、获得数组类型参数 3.4、…

墨觉Run Plus耳机真的很好嘛?南卡、韶音、墨觉哪个好

随着近年来蓝牙耳机市场的快速变化&#xff0c;耳机的样式也在不断演变&#xff0c;从入耳式发展到无需入耳的骨传导耳机。骨传导耳机因其可以通过骨传导技术进行声音传输&#xff0c;无需贴合耳道即可实现耳机功能&#xff0c;因此备受市场欢迎。尤其是近两年&#xff0c;骨传…

linuxARM裸机学习笔记(6)----UART串口通信和串口格式化函数移植实验

UART串口通信 协议介绍&#xff1a;串口通信协议_ft232和ch340是串口的哪种协议_夜路难行々的博客-CSDN博客 I.MX6U UART UART时钟源选择的是pll3_80m&#xff0c;然后在(bit5:0)设置分频值&#xff0c;设置为1分频 ADBR(bit14) &#xff1a;自动波特率检测使能位&#xff0c…

【C++】类和对象(上)

目录 1. 面向过程和面向对象初步认识 2. 类的引入 3. 类的定义 4. 类的访问限定符及封装 4.1 访问限定符 4.2 封装 5. 类的作用域 6. 类的实例化 7. 类对象模型 8. this指针 8.1 this指针的引出 8.2 this指针的特性 没有坚持的努力&#xff0c;本质上并没有多大意…

Git rebase和merge区别详解

文章目录 变基的基础用法变基过程中的冲突解决冲突后无法push问题更新变基后的代码更有趣的变基用法变基的风险用变基解决变基变基 vs 合并 此文在阅读前需要有一定的git命令基础&#xff0c;若基础尚未掌握&#xff0c;建议先阅读这篇文章Git命令播报详版 在 Git 中整合来自不…