Go对Json的支持[encoding/json]

news2025/1/19 3:10:03

数据类型中转json的函数

基本数据转json

Marshal使用以下与类型相关的默认编码:
布尔值编码为JSON布尔值。
浮点数、整数和数字值编码为JSON数字。
字符串值编码为JSON字符串,强制为有效的UTF-8;
用Unicode替换符文替换无效字节。
这样JSON就可以安全地嵌入到HTML

map转JSON


type user struct {
	Username string `json:"name"`
	Userid   string `json:"id"`
	Age      int    `json:"age"`
}

func main() {
	jsonS()
}

func jsonS() {
	//Go的标准包encoding/json对JSON的支持
	//JSON编码即将Go数据类型转换为JSON字符串

	m := make(map[string]interface{})
	m["name"] = "小花"
	m["age"] = 18

	u1 := user{
		Username: "小红",
		Userid:   "1024",
		Age:      10,
	}
	marshal, err := json.Marshal(m)
	i, _ := json.Marshal(u1)
	fmt.Println(i)
	fmt.Println(string(i))
	if err != nil {
		fmt.Println(err.Error())
		return
	}
	fmt.Println(string(marshal))
}


运行结果:
在这里插入图片描述

结构体转json

注意:如果结构体中的字段以小写字母开头,那么结构体在抓换 json时不会解析该字段:

如果结构体转json时定义的结构体没有指定转换json时的字段别名,那么结构体转json后会按照结构体字段名显示
例如:


type DogW struct {
	Name  string
	Age   int
	color string
}

type CatC struct {
	name  string
	age   int
	color string
}

type HenH struct {
	Name  string `json:"name"`
	Age   int    `json:"age"`
	Color string `json:"color"`
}

func main() {
	d := DogW{
		Name:  "汪汪",
		Age:   2,
		color: "黄",
	}
	c := CatC{
		name:  "喵喵",
		age:   3,
		color: "狸花",
	}
	h := HenH{
		Name:  "咯咯哒",
		Age:   1,
		Color: "黄红",
	}
	indent, err := json.MarshalIndent(d, "", "")
	if err != nil {
		fmt.Println("转换失败")
		return
	}
	fmt.Println("Dog结构体转json--", string(indent))
	marshalIndent, err := json.MarshalIndent(c, "", " ")
	fmt.Println("Cat结构体转json--", string(marshalIndent))
	i, err := json.MarshalIndent(h, "", "")
	fmt.Println("Hen结构体转json--", string(i))

}

在这里插入图片描述

将json输出格式化,以便于阅读

	u1 := user{
		Username: "小红",
		Userid:   "1024",
		Age:      10,
	}
//将json输出 格式化
// MarshalIndent类似于Marshal,但使用缩进来格式化输出。

//输出中的每个JSON元素将在以prefix开头的新行开始

//根据缩进嵌套,后跟一个或多个缩进副本。
	indent, err := json.MarshalIndent(u1, "", " ")
	fmt.Println(string(indent))

在这里插入图片描述

结构体匿名字段转Json

type DogW struct {
	
	DName  string
	DAge   int
	DColor string
	CatC   //匿名字段
}

type CatC struct {
	Name  string
	Age   int
	Color string
}


func main() {
	d := DogW{
		DName:  "汪汪",
		DAge:   2,
		DColor: "黄",
		CatC: CatC{
			Name:  "喵喵",
			Age:   3,
			Color: "狸花",
		},
	}

	 
	indent, err := json.MarshalIndent(d, "", "")
	if err != nil {
		fmt.Println("转换失败")
		return
	}
	fmt.Println("Dog结构体转json--", string(indent))
 
}

在这里插入图片描述
注意:json包在解析匿名字段时,会将匿名字段的字段当成该结构体的字段处理

另外,如果嵌套的匿名字段的属性跟外部结构体的字段名一致,那么在转json后 只会显示外部的字段比如下面的代码:

type DogW struct {
	Name  string
	Age   int
	Color string
	CatC  //匿名字段
}

type CatC struct {
	Name  string
	Age   int
	Color string
}

func main() {
	d := DogW{
		Name:  "汪汪",
		Age:   2,
		Color: "黄",
		CatC: CatC{
			Name:  "喵喵",
			Age:   3,
			Color: "狸花",
		},
	}
	indent, err := json.MarshalIndent(d, "", "")
	if err != nil {
		fmt.Println("转换失败")
		return
	}
	fmt.Println("Dog结构体转json--", string(indent))

在这里插入图片描述
这里就有许多情况—下面的情况就很好玩

type DogW struct {
	Name  string
	Age   int
	color string
	CatC  //匿名字段
}

type CatC struct {
	Name  string
	Age   int
	Color string
}

func main() {
	d := DogW{

		Name:  "汪汪",
		Age:   2,
		color: "黄",
		CatC: CatC{
			Name:  "喵喵",
			Age:   3,
			Color: "狸花",
		},
	}
indent, err := json.MarshalIndent(d, "", "")
	if err != nil {
		fmt.Println("转换失败")
		return
	}
	fmt.Println("Dog结构体转json--", string(indent))

结果:
在这里插入图片描述

Marshal()函数源码

func Marshal(v any) ([]byte, error) {
	e := newEncodeState()
	defer encodeStatePool.Put(e)

	err := e.marshal(v, encOpts{escapeHTML: true})
	if err != nil {
		return nil, err
	}
	buf := append([]byte(nil), e.Bytes()...)

	return buf, nil
}

Marshal()函数只有在转换成功的时候才会返回数据,在转换的过程中需要注意如下几点。• JSON对象只支持string作为key,所以要编码一个map,必须是map[string]T这种类型(T是Go语言中的任意类型)。• channel、complex和function是不能被编码成JSON的。• 指针在编码的时候会输出指针指向的内容,而空指针会输出null。

json转Go中数据类型

//结构体
type CatC struct {
	Name  string `json:"name"`
	Age   int    `json:"age"`
	Color string `json:"color"`
}

//json解析
//JSON解析就是将JSON转换为Go数据类型。

func UNJSON() {
	d := DogW{
		Name:  "dog",
		Age:   2,
		color: "黄",
		CatC: CatC{
			Name:  "喵喵",
			Age:   3,
			Color: "狸花",
		},
	}
	//转换成json
	indent, err := json.MarshalIndent(d, "", " ")
	if err != nil {
		return
	}

	fmt.Println(string(indent))
	var dog DogW
	//json转go类型
	err = json.Unmarshal(indent, &dog)
	fmt.Println(dog)

	data := `[{"level":"debug","Msg":"File:\"test.txt\"NOT FOUND"},` + `{"Level":"","msg":"Logic error"}]`
	Catc := `{"Name":"狸花猫","Age":2,"Color":"梨花"}`
	Catd := `{"name":"狸花猫","age":2,"color":"梨花"}`
	var mapM []map[string]string
	json.Unmarshal([]byte(data), &mapM)
	var catc CatC
	var catd CatC
	json.Unmarshal([]byte(Catc), &catc)
	json.Unmarshal([]byte(Catd), &catd)
	fmt.Println(mapM)
	fmt.Println(catc)
	fmt.Println(catd)
}

func main() {
	UNJSON()
}

注意json.Unmarshal([]byte(data), &mapM)中第二个参数要取址才会将解析出来的数据赋值给 对象mapM

JSON可以转换成结构体。同编码一样,json包是通过反射机制来实现解码的,因此结构体必须导出所转换的字段,不导出的字段不会被json包解析。另外解析时不区分大小写

json转结构体时也是支持json标签的:
结果如下:

{
 "Name": "dog",
 "Age": 2,
 "name": "喵喵",
 "age": 3,
 "color": "狸花"
}
{dog 2  {喵喵 3 狸花}}                                                     
[map[Msg:File:"test.txt"NOT FOUND level:debug] map[Level: msg:Logic error]]
{狸花猫 2 梨花}                                                            
{狸花猫 2 梨花}                                                            


如果在换转换时有匿名字段—>>

在解码JSON时,如果找不到字段,则查找字段的字段

比如下面的例子:

type CatCC struct {
	Name  string `json:"name"`
	Age   int    `json:"age"`
	Color string `json:"color"`
}
type DogWW struct {
	DName  string
	DAge   int
	Dcolor string
	CatCC  //匿名字段
}

func main() {
	//UNJSON()
	TestUnjson()
}

func TestJson() {
	Dogw := `{"DName":"dogdog","DAge":22,"Dcolor":"Black","CatCC":{"Name":"喵miaomiao喵","Age":3,"Color":"狸花"}}`
	Dogww := `{"Name":"dogdog","Age":22,"color":"Red","CatCC":{"Name":"喵miaomiao喵","Age":3,"Color":"狸花"}}`
	var dog *DogWW
	var dogw *DogWW
	json.Unmarshal([]byte(Dogw), dog)
	json.Unmarshal([]byte(Dogww), dogw)
	fmt.Println(&dog)
	fmt.Println(&dogw)
}

运行结果:
在这里插入图片描述

结构体没有字段时,会使用结构体字段对应的类型默认值

这也体现了 结构体中嵌套了匿名结构体----继承

如果结构体属性中没有值,那么我们可以通过加入 json 字段来将空的值给忽略:

type User struct {
	Name  string   `json:"name"`
	Email string   `json:"email"` //加上omitempty标签,表示输出会将空值忽略掉,此时暂不加,看结果
	Hobby []string `json:"hobby"`
}

func omitemptyDemo1() {
	// 当 struct 中的字段没有值Email,Hobby 字段时
	us := User{
		Name: "Gavin",
	}

	
	b, err := json.Marshal(us)
	if err != nil {
		fmt.Printf("json.Marshal failed, err:%v\n", err)
		return
	}
	fmt.Printf("str:%s\n", b)
}

运行结果:

{"name":"Jack","email":"","hobby":null}
str:{"name":"Jack","email":"","hobby":null}

加入omitempty标签后:

type User struct {
	Name  string   `json:"name"`
	Email string   `json:"email,omitempty"` //加上omitempty标签,表示输出会将空值忽略掉
	Hobby []string `json:"hobby,omitempty"`
}
//运行结果  str:{"name":"Jack"}   

json转嵌套结构体

type Pig struct {
	PName string `json:"pname"`
	Age   int    `json:"age"`
}

type Animals struct {
	Types string
	Group []Pig
}

func main() {
	var r Animals
	s := `{"Types":"猪","Group":[{"pname":"大猪","age":3},{"pname":"小猪仔","age":1}]}`
	err := json.Unmarshal([]byte(s), &r)
	if err != nil {
		fmt.Print(err)
	}
	fmt.Println(r)
}

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

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

相关文章

2023年5月软考考试真题及答案汇总

2023上半年软考考试在5月27日-5月28日举行,为大家整理了各科目的考试真题及答案,可用于估分。(会持续更新哦) ​ 2023年上半年系统集成项目管理工程师上午题 1、在( )领域,我国还远未达到世界…

【数据结构】---几分钟简单几步学会手撕链式二叉树(中)

文章目录 前言🌟一、二叉树链式结构的实现🌏1.1 二叉树叶子节点个数💫代码:💫流程图: 🌏1.2 二叉树的高度💫第一种写法(不支持):📒代码:&#x1f…

TCP协议的三次握手和四次挥手

完整的TCP内容,请参考RFC 9293 TCP协议为应用提供可靠的、有序的的字节流服务。TCP是面向连接的,提供了全双工的通信。TCP使用端口号来识别应用程序服务并在主机之间复用不同的流。 TCP header格式 TCP header也像IP header一样,在header中…

【Kafka】超详细介绍

文章目录 概念部署方案磁盘网络CPUpartition的数量 命令查看版本找kafka和zookeeper的ip/porttopic创建 topic查看get topic 列表get topic 详情 修改topic修改分区级别参数(如增加partition) 删除topic设置消息大小上限 生产查看生产生产消息 查看消费server 查看 offset查看积…

车载电子之汽车HUD技术

一、什么是HUD技术 HUD(head up display抬头显示器)是将重要信息显示在挡风玻璃上的一种显示系统,基本原理是:投影仪发出的光信息,经过一系列的折射、反射等投影到挡风玻璃上,人眼就能看到投射在上面的信息…

springboot+vue广场舞团系统(java项目源码+文档)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的广场团舞系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者:风歌&a…

Jmeter接口测试-websocket测试

壹 Jmeter接口测试-websocket测试 测试之前的准备工作,需要websocket插件 方式一: 去github下载: https://github.com/maciejzaleski/JMeter-WebSocketSampler/wiki/Dependencies jetty-http-9.1.2.v20140210.jarjetty-io-9.1.2.v20140210.jarjetty-util-9.1.2.v20140210…

华为OD机试真题 Java 实现【云短信平台优惠活动】【2023Q1 200分】,附详细解题思路

一、题目描述 某云短信厂商&#xff0c;为庆祝国庆&#xff0c;推出充值优惠活动。 现在给出客户预算&#xff0c;和优惠售价序列&#xff0c;求最多可获得的短信总条数。 二、输入描述 第一行客户预算M&#xff0c;其中 0<M<1000000。 第二行给出售价表&#xff0c…

华为OD机试真题B卷 Java 实现【小朋友排队】

一、题目描述 小明今年升学到了小学1年级&#xff0c;来到新班级后&#xff0c;发现其他小朋友身高参差不齐&#xff0c;然后就想基于每个小朋友和自己的身高差&#xff0c;对他们进行排序&#xff0c;请帮他实现排序。 二、输入描述 第一行为正整数h和n。 0 < h < 2…

算法基础学习笔记——⑤离散化\区间和并

✨博主&#xff1a;命运之光 ✨专栏&#xff1a;算法基础学习 目录 ✨简述 特指整数离散化 &#x1f353;离散化模板&#xff1a; ✨区间和并 &#x1f353;区间和并模板&#xff1a; 前言&#xff1a;算法学习笔记记录日常分享&#xff0c;需要的看哈O(∩_∩)O&#xff0…

【树上差分+LCA】篮球杯 砍树

省赛的题现在来补 感觉什么都不会&#xff0c;已经要没了 题意&#xff1a; 思路&#xff1a; 考虑一条边&#xff0c;两端有两棵子树 有这样的性质&#xff1a; 这条边两端的结点的经过次数M 因此每加一个点对&#xff0c;都对其路径1 s[u]M时&#xff0c;与该点连着的…

大数据Doris(二十八):Broker Load通配符导入HDFS数据并指定列顺序

文章目录 Broker Load通配符导入HDFS数据并指定列顺序 一、创建Doris表 2、准备HDFS数据

Maven学习笔记(基础篇)22版

1. 概述部分 1. 什么是 Maven&#xff1f; 为什么要学习Maven&#xff1f; 管理规模庞大的 jar 包&#xff0c;需要专门工具。脱离 IDE 环境执行构建操作&#xff0c;需要专门工具。 1、构建 Java 项目开发过程中&#xff0c;构建指的是使用『原材料生产产品』的过程。 原…

二叉树的镜像 JZ27

目录 链接 描述 示例 代码 演示结果 链接 二叉树的镜像_牛客题霸_牛客网 描述 示例 代码 /*** struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* };*/ class Solution …

花朵识别系统Python实现,深度学习卷积神经网络算法

一、背景 花朵识别系统&#xff0c;基于Python实现&#xff0c;深度学习卷积神经网络&#xff0c;通过TensorFlow搭建卷积神经网络算法模型&#xff0c;并对数据集进行训练最后得到训练好的模型文件&#xff0c;并基于Django搭建可视化操作平台。 在当今信息化社会&#xff0c…

算法基础学习笔记——⑥链表\栈\队列

✨博主&#xff1a;命运之光 ✨专栏&#xff1a;算法基础学习 目录 ✨单链表 &#x1f353;单链表模板&#xff1a; ✨双链表 &#x1f353;双链表模板&#xff1a; &#x1f353;循环链表图&#xff1a; ✨栈 &#x1f353;栈模板&#xff1a; ✨队列 &#x1f353;队…

【脚本工具】SVG路径中的A指令转DXF的圆弧和椭圆弧 C++代码实现

文章目录 一、SVG路径的A指令的语法说明二、DXF中的圆弧和椭圆弧对象2.1 圆弧对象2.2 椭圆弧对象 三、转DXF圆弧3.1 数学公式3.2 代码实现3.3 转换效果展示 四、转DXF椭圆弧4.1 数学公式4.2 代码实现4.3 转换效果展示 一、SVG路径的A指令的语法说明 目前Svg的Arc的参数字符串如…

leetcode--分隔链表(java)

分割链表 leetcode 86 分割链表 &#xff08;中等&#xff09;解题思路&#xff1a;链表专题 leetcode 86 分割链表 &#xff08;中等&#xff09; leetcode 86 分割链表 原题链接&#xff0c;可以直接测试 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进…

怎么给苹果手机设备画面投屏到电脑上面?

虽然使用苹果设备自带的AirPlay功能&#xff0c;搭配其推出的Apple TV设备&#xff0c;可实现苹果设备的投屏播放&#xff0c;但相信很多人都不会花大价钱去购入Apple TV&#xff0c;如果是土豪的话请随意。 那么&#xff0c;没有Apple TV&#xff0c;苹果设备就不能投屏了吗&…

sql注入学习-知识点大合集

目录 &#xff08;一&#xff09;sql注入了解&#xff1a; 1.1什么是sql注入 1.2 sql注入的分类 &#xff08;二&#xff09;sql注入详解&#xff1a; 2.1.MySQL注入 2.2.1在MySQL注入中&#xff0c;会用到的知识 2.2.2mysql常用语句与常见 2.2.3msyql注入内容详解 2.2…