go 语言中 json.Unmarshal([]byte(jsonbuff), j) 字节切片得使用场景

struct_tag的使用

在上面的例子看到,我们根据结构体生成的json的key都是大写的,因为结构体名字在go语言中不大写的话,又没有访问权限,这种问题会影响到我们对json的key的名字,所以go官方给出了struct_tag的方法去修改生成json时,对应key的名字

package main

import (
	"encoding/json"
	"fmt"
)

//成员变量名首字母必须大写
type IT struct {
	//Company  string   `json:"-"` //此字段不会输出到屏幕

	// ''单引号后面是struct,代表二次编码,可以把生成的json的key从大写变成小写
	Company  string   `json:"company"`
	Subjects []string `json:"subjects"`
	IsOk     bool     `json:"isok"`
	//IsOk  bool    `json:"string"`//转成字符串再输出编码
	Price float64 `json:"price"`
}

func main() {
	// 1. 定义一个结构体变量,同时初始化
	s := IT{"itcast", []string{"Go", "C++", "Python", "Test"}, true, 666.666}

	// 2. 编码,根据内容生成json文本
	buf, err := json.MarshalIndent(s, "", " ") //格式化编码
	if err != nil {
		fmt.Println("err = ", err)
		return
	}

	fmt.Println("buf = ", string(buf))
}

map 生成json

package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	// 1. 创建一个map,注意value是万能指针类型
	m := make(map[string]interface{}, 4)
	m["company"] = "itcast"
	m["subjects"] = []string{"Go", "C++", "Python", "Test"}
	m["isok"] = true
	m["price"] = 666.666

	// 2. 编码成json
	//result, err := json.Marshal(m)
	result, err := json.MarshalIndent(m, "", " ")
	if err != nil {
		fmt.Println("err = ", err)
		return
	}
	fmt.Println("result = ", string(result))
}

json解析到map

package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	jsonBuf := `
    {
    "company": "itcast",
    "subjects": [
        "Go",
        "C++",
        "Python",
        "Test"
    ],
    "isok": true,
    "price": 666.666
}`

	// 1. 创建一个map
	m := make(map[string]interface{}, 4)

	// 2. 第二个参数要地址传递
	err := json.Unmarshal([]byte(jsonBuf), &m)
	if err != nil {
		fmt.Println("err = ", err)
		return
	}
	fmt.Printf("m = %+v\n", m)

	//var str string
	//str = string(m["company"])// err,无法转换,
	//str = m["company"].(string)// ok.或者通过类型断言取map的内容。
	//fmt.Printf("str = %s\n", str)
	
	// 3. 类型断言, 值,它是value类型
	var str string
	for key, value := range m {
		//fmt.Printf("%v ============> %v\n", key, value)
		switch data := value.(type) {
		case string:
			str = data
			fmt.Printf("map[%s]的值类型为string, value = %s\n", key, str)
		case bool:
			fmt.Printf("map[%s]的值类型为bool, value = %v\n", key, data)
		case float64:
			fmt.Printf("map[%s]的值类型为float64, value = %f\n", key, data)
		case []string:
			fmt.Printf("map[%s]的值类型为[]string, value = %v\n", key, data)
		case []interface{}:
			fmt.Printf("map[%s]的值类型为[]interface, value = %v\n", key, data)
		}

	}

}

json解析到结构体

package main

import (
	"encoding/json"
	"fmt"
)

type IT struct {
	Company  string   `json:"company"`
	Subjects []string `json:"subjects"` //二次编码
	IsOk     bool     `json:"isok"`
	Price    float64  `json:"price"`
}

func main() {

	jsonBuf := `
    {
    "company": "itcast",
    "subjects": [
        "Go",
        "C++",
        "Python",
        "Test"
    ],
    "isok": true,
    "price": 666.666
}`

	// 一 获取json全部的内容
	// 1. 定义一个结构体变量
	var tmp IT

	// 2. 第二个参数要地址传递,否则无法修改变量的值
	err := json.Unmarshal([]byte(jsonBuf), &tmp)
	if err != nil {
		fmt.Println("err = ", err)
		return
	}
	//fmt.Println("tmp = ", tmp)
	fmt.Printf("tmp = %+v\n", tmp)
	
	// 二 获取json指定的内容
	type IT2 struct {
		Subjects []string `json:"subjects"` //二次编码
	}

	var tmp2 IT2
	err = json.Unmarshal([]byte(jsonBuf), &tmp2) //第二个参数要地址传递
	if err != nil {
		fmt.Println("err = ", err)
		return
	}
	fmt.Printf("tmp2 = %+v\n", tmp2)

}

在Go语言中,[]byte(jsonBuf)这个表达式的作用是将一个名为jsonBuf的字节切片(byte slice)转换为[]byte类型。这里涉及到了Go语言中的类型转换概念。
在Go中,[]byte是一个切片(slice)类型,它底层的类型是byte,即uint8。这意味着[]byte可以包含任意数量的字节,每个字节都是uint8类型的值。当我们使用[]byte(jsonBuf)时,我们实际上是在告诉Go将jsonBuf这个变量的内容——假设它是一个字节切片——转换成一个新的[]byte切片。
这种转换通常用在以下几种场景:
类型匹配:有时候你需要确保一个变量是[]byte类型,以便能够使用特定的方法或函数对其进行操作。
接口要求:Go的某些接口要求传入的参数是[]byte类型,例如,当你需要向一个函数传递一个可以被解码为JSON的对象时。
性能考虑:在某些性能敏感的场合,直接操作[]byte可能会比操作字符串(string)更高效,因为字符串在Go中是不可变的,而字节切片是可变的。
API规范:某些外部API或库可能期望接收[]byte类型的数据,这时你需要将其他类型的数据转换为[]byte。
简而言之,[]byte(jsonBuf)的作用是将jsonBuf这个字节切片转换为[]byte类型,以便在Go程序中进行进一步的字节操作。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

跑步运动耳机哪个牌子好?2024年国产运动耳机推荐

​无论春夏秋冬,无论室内还是户外,运动都能带给我们无尽的乐趣。而一副好的运动耳机,更能为我们的运动体验增色不少。今天,就让我为大家推荐几款值得一试的运动耳机吧。 1.南卡开放式耳机(00压) 一句话评价…

持续集成工具Jenkins的使用之安装篇(一)

Jenkins是一个基于Java开发的开源的一种持续集成工具,主要用于环境部署,监控重复性的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成。要想使用它,你就必须的先安装,接下来我们就介绍下J…

工业计算机应用——物流行业

工业计算机在物流行业的应用 随着全球化和电商的快速发展,物流行业已经成为现代经济体系中的重要支柱。在这个高度自动化的行业中,工业计算机扮演着至关重要的角色。本文将深入探讨工业计算机在物流行业的应用及其优势。 一、工业计算机在物流行业的应用场景 仓储管理工业计…

服务器数据恢复—服务器进水导致阵列中磁盘同时掉线的数据恢复案例

服务器数据恢复环境: 数台服务器数台存储阵列柜,共上百块硬盘,划分了数十组lun。 服务器故障&检测: 外部因素导致服务器进水,进水服务器中一组阵列内的所有硬盘同时掉线。 北亚数据恢复工程师到达现场后发现机房内…

Web开发4:单元测试

在Web开发中,单元测试是一种重要的开发实践,它可以帮助我们确保代码的质量和可靠性。通过编写和运行单元测试,我们可以验证代码的正确性,减少错误和缺陷,并提高代码的可维护性。本文将介绍单元测试的概念、好处以及如何…

Vue.js 3 项目开发:迈向现代化前端开发的必经之路

文章目录 一、Vue.js 3简介二、Vue.js 3新特性1. Composition API2. 更好的性能3. 更好的TypeScript支持4. 更多的生命周期钩子5. 更好的自定义指令API 三、Vue.js 3项目开发实践1. 搭建开发环境2. 项目结构规划3. 组件开发4. 路由管理5. 状态管理6. 测试与部署 《Vue.js 3企业…

首批!鸿蒙千帆起,生态全面启动

在近日举办的鸿蒙生态千帆启航仪式上,华为常务董事、终端BG CEO余承东表示,鸿蒙生态设备已经增至8亿 ,将打开万亿产业新蓝海。 在本次论坛上,华为宣布HarmonyOS NEXT鸿蒙星河版(开发者预览版)已面向开发者…

汤姆·齐格弗里德《纳什均衡与博弈论》笔记(5)社会物理学

第七章 凯特勒的统计数据和麦克斯韦的分子理论——数据与社会学,数据与物理学 哈里谢顿的心理史学 半个多世纪前,当艾萨克阿西莫夫创立科幻般的心理史学时,并没为细究数学如何起作用而劳神苦思,只简单地说可以像描述分子群那样描…

virtualenv虚拟环境的安装使用教程

让我们先思考这样一种情景:我们用python来开发一个项目,那么这个项目肯定会依赖很多的第三方库,这些第三方的库通过pip安装到全局区当中,而对于不同的项目使用到的库可能都有所不同,但是这些项目的库都安装到全局区当中…

黑马Java 集合(上)

我是南城余!阿里云开发者平台专家博士证书获得者! 欢迎关注我的博客!一同成长! 一名从事运维开发的worker,记录分享学习。 专注于AI,运维开发,windows Linux 系统领域的分享! 知…

【爬虫、数据可视化实战】以“人口”话题为例爬取实时微博数据并进行舆情分析

前言: 近期在weibo上讨论的比较热的话题无非就是“人口”了。TaoTao也看了一些大家发的内容。但是感觉单纯的看文字内容不能很直观的反应出来大家的关切。索性就使用爬虫对数据进行爬取,同时结合着数据可视化的方式让数据自己开口说话。那么接下来就让我…

第08章_面向对象编程(高级)(static,单例设计模式,理解mian方法,代码块,final,抽象类与抽象方法,接口,内部类,枚举类,注解,包装类)

文章目录 第08章_面向对象编程(高级)本章专题与脉络1. 关键字:static1.1 类属性、类方法的设计思想1.2 static关键字1.3 静态变量1.3.1 语法格式1.3.2 静态变量的特点1.3.3 举例1.3.4 内存解析 1.4 静态方法1.4.1 语法格式1.4.2 静态方法的特点1.4.3 举例 1.5 练习 …

5大免费代理IP合集,你的代理IP该换啦!

一连代理 代理IP提供平台,代理IP覆盖HTTP/HTTPS/SOCKS5协议,涵盖直连和隧道代理。一键操作可以随机更换IP,实现高效稳定的网络代理。支持在PC、iOS和安卓等平台上使用。当前免费试用选项,让用户能够在使用之前先了解服务的性能和效…

常见PCB封装

表面贴片封装 通孔封装 公众号 | FunIO 微信搜一搜 “funio”,发现更多精彩内容。 个人博客 | blog.boringhex.top

uniapp开发小程序—scroll-view实现内容滚动时, 标题也滚动

一、需求 scroll-view实现内容滚动时&#xff0c; 标题也滚动 二、效果 三、代码实现 <template><view class"content"><view class"head">头部固定区域</view><view class"list_box"><!-- 菜单左边 -->&l…

Spring boot3.x 无法向 Nacos2.x进行服务注册的问题

一&#xff1a;问题描述 配置中心都是可用的&#xff0c;但是就是无法向nacos进行服务注册。 二&#xff1a;问题可能出现的原因有如下两种 1.Nacos2.0版本相比1.X新增了gRPC的通信方式&#xff0c;因此需要增加2个端口。除了8848还需要开放9848&#xff0c;9849端口。 官方…

基于springboot+vue的在线文档管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 背景和意…

深入理解多线程编程和 JVM 内存模型

目录 一、什么是多线程编程 二、JVM介绍 三、 JVM 内存模型 一、什么是多线程编程 多线程编程是一种编程方式&#xff0c;它允许程序在同一时间内执行多个线程或任务。线程是程序执行的最小单位&#xff0c;多线程编程可以将任务拆分为多个线程&#xff0c;每个线程独立执行…

vue全局公共样式

vue公共样式代码存放在/src/styles文件夹里 index里引入其他组件公共样式&#xff0c;index.scss文件内容如下&#xff1a; import ./sidebar.scss; import ./searchForm.scss;body {height: 100%;-moz-osx-font-smoothing: grayscale;-webkit-font-smoothing: antialiased;t…

网络通信(15)-C#TCP客户端掉线重连实例

本文上接前面的文章使用Socket在C#语言环境下完成TCP客户端的掉线重连实例。 掉线重连需要使用心跳包发送测试网络的状态,进而进入重连循环线程。 前面实例完成的功能: 客户端与服务器连接,实现实时刷新状态。 客户端接收服务器的数据。 客户端发送给服务器的数据。 客…