广告
返回顶部
首页 > 资讯 > 后端开发 > GO >golang中json操作的完全指南
  • 734
分享到

golang中json操作的完全指南

2024-04-02 19:04:59 734人浏览 独家记忆
摘要

目录前言1. 结构体与JSON互转2. map与jsON互转3. 结构体的变量不加tag标签能否正常转成json数据4. JSON操作的一些小技巧(1)忽略掉 struct 指定字段

前言

JSON是一种轻量级的数据交换格式。易于阅读和编写。 Golang 提供了 encoding/json 包来操作JSON数据。

1. 结构体与JSON互转

(1)使用 json.Marshal() 方法,把结构体转成 JSON字符串

import (
	"encoding/json"
	"fmt"
)

type Student struct {
	Name string
	Age int
	Skill string
}

func main()  {
	stu := Student{"tom", 12, "football"}
	data, err := json.Marshal(&stu)
	if err != nil {
		fmt.Printf("序列化错误 err=%v\n", err)
		return
	}
	fmt.Println("序列化后: ", string(data))
}

打印: 序列化后: {“Name”:“tom”,“Age”:12,“Skill”:“football”}

(2)JSON字符串 转 结构体,可以使用 json.Unmarshal()方法

func main()  {
	str := `{"Name":"tom","Age":12,"Skill":"football"}`
	var stu2 Student
	err := json.Unmarshal([]byte(str), &stu2)
	if err != nil {
		fmt.Printf("反序列化错误 err=%v\n", err)
		return
	}
	fmt.Printf("反序列化后: Student=%v, Name=%v\n", stu2, stu2.Name)
}

打印: 反序列化后: Student={tom 12 football}, Name=tom

(3)如何实现结构体序列化后key的名称能自定义

对于自定义key的名称,可以给 struct变量指定一个tag标签

type Student struct {
	Name string   `json:"stu_name"`
	Age int       `json:"stu_age"`
	Skill string  // 也可以不指定 tag标签,默认就是 变量名称
}

func main()  {
	stu := Student{"tom", 12, "football"}
	data, err := json.Marshal(&stu)
	if err != nil {
		fmt.Printf("序列化错误 err=%v\n", err)
		return
	}
	fmt.Println("序列化后: ", string(data))
}

打印后,可以看到 key的名称已经变成了我们指定的 tag标签 的名称

序列化后: {“stu_name”:“tom”,“stu_age”:12,“Skill”:“football”}

2. map与JSON互转

func main()  {
	// map 转 Json字符串
	m := make(map[string]interface{})
	m["name"] = "jetty"
	m["age"] = 16

	data, err := json.Marshal(&m)
	if err != nil {
		fmt.Printf("序列化错误 err=%v\n", err)
		return
	}
	fmt.Println("序列化后: ", string(data))    // 打印: 序列化后:  {"age":16,"name":"jetty"}

	// Json字符串 转 map
	str := `{"age":25,"name":"car"}`
	err = json.Unmarshal([]byte(str), &m)
	if err != nil {
		fmt.Printf("反序列化错误 err=%v\n", err)
		return
	}
	fmt.Printf("反序列化后: map=%v, name=%v\n", m, m["name"])
	// 打印: 反序列化后: map=map[age:25 name:car], name=car
}

3. 结构体的变量不加tag标签能否正常转成json数据

如果变量首字母小写,则为private。因为取不到反射信息,不能转。

如果变量首字母大写,则为public。不管加不加 tag 都能正常转,加了tag的变量就按照tag的名称显示。

示例:

type User struct {
	Name string    `json:"u_name"`
	age int        `json:"u_age"`
	Skill string   // 也可以不指定 tag标签,默认就是 变量名称
	addr string
}

func main()  {
	user := User{"admin", 23, "football", "上海"}
	data, err := json.Marshal(&user)
	if err != nil {
		fmt.Printf("序列化错误 err=%v\n", err)
		return
	}
	fmt.Println("序列化后: ", string(data))  // 打印: 序列化后:  {"u_name":"admin","Skill":"football"}
}

通过打印,我们发现小写的变量,如 age、addr 都没有转成 json数据。

总结:

首字母小写的不管加不加tag都不能转为json数据,而大写的加了tag可以取别名,不加tag则json内的字段跟结构体变量原名一致

4. JSON操作的一些小技巧

(1)忽略掉 struct 指定字段

type User struct {
	Name string    `json:"u_name"`
	PassWord string `json:"password"`
	Email string `json:"email"`
}

func main()  {
	user := User{"admin", "pwd", "user@163.com"}
	person := Person{23, "上海"}
	// 忽略掉 Password 字段
	data, _ := json.Marshal(struct {
		*User
		Password string `json:"password,omitempty"`
	}{User: &user})
	fmt.Println("忽略字段: ", string(data))  // 打印: 忽略字段: {"u_name":"admin","email":"user@163.com"}
}

忽略字段: {“u_name”:“admin”,“email”:“user@163.com”}}

(2)添加额外的字段

data, _ = json.Marshal(struct {
	*User
	Skill string `json:"skill"`  // 临时添加额外的 Skill字段
}{
	User: &user,
	Skill: "football",
})

fmt.Println("添加额外字段: ", string(data))

添加额外字段: {“u_name”:“admin”,“password”:“pwd”,“email”:“user@163.com”,“skill”:“football”}

(3)合并两个 struct

type User struct {
	Name string    `json:"u_name"`
	Password string `json:"password"`
	Email string `json:"email"`
}

type Person struct {
	Age int
	Addr string `json:"addr"`
}

func main()  {
    // 初始化两个 struct
	user := User{"admin", "pwd", "user@163.com"}
	person := Person{23, "上海"}
	
	data, _ := json.Marshal(struct {
		*User
		*Person
	}{
		User: &user,
		Person: &person,
	})
	
	fmt.Println("合并两个struct: ", string(data))
}

合并两个struct: {“u_name”:“admin”,“password”:“pwd”,“email”:“user@163.com”,“Age”:23,“addr”:“上海”}

(4)字符串传递给 int类型

emp := struct {                    // 创建匿名 struct
	Num int `json:"num,string"`
}{15,}
data, _ := json.Marshal(&emp)
fmt.Println("数字转成字符串: ", string(data))       // 数字转成字符串: {"num":"15"}

str := `{"Num":"25"}`
_ = json.Unmarshal([]byte(str), &emp)
fmt.Printf("字符串转成数字: Emp.Num=%v\n", emp.Num) // 字符串转成数字: Emp.Num=25

(5)一个 json 分成两个struct

str = ` {"u_name":"system","password":"abc","email":"user2@163.com","Age":23,"addr":"杭州"}`
var user2 User
var person2 Person
_ := json.Unmarshal([]byte(str), &struct {
	*User
	*Person
}{
	User: &user2,
	Person: &person2,
})

fmt.Printf("分成两个struct: User=%v, Person=%v\n", user2, person2)

分成两个struct: User={system abc user2@163.com}, Person={23 杭州}

补充:GoLang json格式化输出

简单记录一下go语言json格式化输出的办法

import (
    "bytes"
    "encoding/json"
    "fmt"
    "os"
)

type Complex_Type struct{
    Age int `json:"age"`
    Name string `json:"name"`
    Grades map[string]int `json:"grade"`
    Parents []string `json:"parents"`
}

    grades := map[string]int{
        "math" : 96,
        "chinese" : 87,
        "english" : 93,
    }

    parents := []string{
        "minato",
        "kushina",
    }

    complex_type := Complex_Type{
        Age: 18,
        Name: "Naruto",
        Grades : grades,
        Parents: parents,
    }
    res,err := json.Marshal(complex_type)
    exitOnError(err)
    var out bytes.Buffer
    err = json.Indent(&out,res,"","\t")
    out.WriteTo(os.Stdout)
    fmt.Printf("\n")

输出:

总结

到此这篇关于golang中json操作的文章就介绍到这了,更多相关golang json操作内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: golang中json操作的完全指南

本文链接: https://www.lsjlt.com/news/164235.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • golang中json操作的完全指南
    目录前言1. 结构体与JSON互转2. map与JSON互转3. 结构体的变量不加tag标签能否正常转成json数据4. JSON操作的一些小技巧(1)忽略掉 struct 指定字段...
    99+
    2022-11-13
  • PHP中的JSON操作指南
    一、JSON的基础知识1.1 什么是JSONJSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它是一种基于文本的格式,能够被多种编程语言解析和生成。JSON数据可以在JavaScript中使用,也可...
    99+
    2023-05-20
    PHP JSON 操作指南
  • Python中json库的操作指南
    目录概念json操作json转换成字典:字典转成json串总结概念 json是一种通用的数据类型一般情况下接口返回的数据类型都是json长得像字典,形式也是k-v{ }其实json是...
    99+
    2023-05-14
    python中的json库 python读取json python json库
  • MySQL5.7中的JSON基本操作指南
    前言 因为项目需要,存储字段存储成了JSON格式,在项目中是将查询出来的值通过jackson转成相应的bean进行处理的,觉得不够简单方便。 MySQL从5.7版本开始就支持JSON格式的数据,操作用起来挺...
    99+
    2022-10-18
  • golang连接sqlx库的操作使用指南
    目录sqlx库使用指南sqlx介绍安装sqlx基本使用连接数据库查询插入、更新和删除NamedExecNamedQuery事务操作sqlx.Insqlx.In的批量插入示例表结构结构...
    99+
    2022-11-13
  • 利用Python操作excel表格的完美指南
    目录主旨环境安装模块新建excel单元格写入数据合并单元格居中显示修改字体和颜色总结主旨 在日常工作中,我们会经常且频繁的使用excel表格,那么我们是否可以通过python来操作e...
    99+
    2022-11-13
  • PHP中的cURL操作指南
    随着互联网的兴起,网站间的数据交换越来越频繁。在这个交流过程中,经常会有一些需要从其他网站获取数据的需求,如天气预报、股票数据等等。cURL(Client URL)就是一个解决这种需求的利器,它是一个在PHP中操作URL和数据的函数库,可以...
    99+
    2023-05-21
    PHP curl 操作指南
  • PHP中的PDO操作指南
    在PHP中,使用PDO操作数据库可以提高代码的安全性和移植性。PDO是一种PHP的扩展,为数据库访问提供了一个统一的接口,支持多种数据库类型。本文将为大家介绍PDO的基本用法和注意事项。1.连接数据库使用PDO连接数据库需要提供以下参数:$...
    99+
    2023-05-21
    PHP pdo 操作指南
  • PHP中的XML操作指南
    PHP中的XML操作指南XML(可扩展标记语言)是一种非常流行的数据交换格式,在Web开发中被广泛使用。在PHP中,可以轻松地读取、创建和修改XML文档。本文将为您介绍如何在PHP中使用XML。读取XML在PHP中,使用SimpleXML扩...
    99+
    2023-05-21
    PHP xml 操作指南 (操作指南可能不是一个专业编程术语 但可以理解为"操作指南"在该文章中充当
  • PHP中的DOM操作指南
    在网页开发中,DOM(Document Object Model)是一个非常重要的概念。它可以让开发者轻松地对一个网页的HTML或XML文档进行修改和操作,比如添加、删除、修改元素等。而PHP中内置的DOM操作库也为开发者提供了丰富的功能,...
    99+
    2023-05-21
    PHP dom 操作指南
  • PHP中的COOKIE操作指南
    PHP作为一种非常常用的后端开发语言,其操作COOKIE的功能也非常强大。本文将为大家提供一份PHP中COOKIE操作的指南,帮助大家熟练掌握该功能。一、什么是COOKIE在了解COOKIE的操作前,我们需要先了解什么是COOKIE。COO...
    99+
    2023-05-21
    PHP cookie 操作指南
  • PHP中的MySQL操作指南
    PHP是Web开发中最常用的编程语言之一,而MySQL则是最受欢迎的关系型数据库管理系统之一。在Web应用程序开发过程中,PHP的一个主要功能就是与MySQL数据库进行交互,以存储和检索数据。本文将为您提供一个基本的MySQL操作指南,以帮...
    99+
    2023-05-22
    MySQL PHP 操作指南
  • PHP中的FFmpeg操作指南
    FFmpeg是一种基于命令行的音视频处理工具,可以用于转码、剪辑、裁剪、合并、加速、调节音量等多种功能,广泛应用于多媒体领域。在PHP中,我们也可以通过调用FFmpeg的命令行参数来实现音视频处理功能。本文将介绍如何在PHP中使用FFmpe...
    99+
    2023-05-21
    PHP 操作指南 FFmpeg
  • PHP中的SESSION操作指南
    随着互联网的不断发展,Web应用程序越来越普及。为了使Web应用程序更加实用和个性化,需要对用户进行身份验证和跟踪。在PHP中,使用SESSION来完成这些任务。本文将介绍如何在PHP中进行SESSION操作,以及常见的SESSION应用。...
    99+
    2023-05-21
    PHP session 操作指南
  • PHP中的音频操作指南
    PHP作为一种广泛使用的服务器端语言,在许多Web应用程序中扮演着重要的角色。音频处理是一个很常见的需求,例如音乐网站和音频产品销售网站等。在本文中,将为读者介绍如何在PHP中操作音频文件。一、了解音频格式在PHP中操作音频文件前,需要先了...
    99+
    2023-05-20
    指南 PHP 音频操作
  • PHP中的GD库操作指南
    一、什么是GD库?GD库是一组用于创建和处理各种图像格式的库函数,是PHP中最为常用的图像处理库之一。二、安装GD库在CentOS/RedHat下安装GD库1.安装PHP的GD扩展库yum install php-gd2.重启web服务器s...
    99+
    2023-05-20
    PHP GD库 操作指南
  • PHP中的文件操作指南
    PHP是一种服务器端编程语言,开发人员可以使用它来开发各种类型的Web应用程序。在开发Web应用程序时,文件操作可能是一个经常需要用到的功能。在本篇文章中,我们将深入介绍PHP中的文件操作指南。一、创建文件在PHP中创建一个文件很简单,只需...
    99+
    2023-05-22
    PHP 文件操作 文件读取 文件写入
  • PHP中的数组操作指南
    作为一种常用的编程语言,PHP 提供了多种数据类型和操作方式,其中数组是一种非常重要的数据类型。在 PHP 中,数组可以用来存储多个值,并能够进行多种操作和处理。本文将为大家介绍 PHP 中的数组操作指南,帮助大家更好地使用和处理数组。声明...
    99+
    2023-05-22
    PHP 数组 操作
  • PHP中的图像操作指南
    PHP是一门广泛使用的动态语言,尤其在Web开发领域中得到了广泛的应用,图像操作是Web开发中很重要的一环,PHP提供了丰富的图像处理函数和拓展库,本篇文章将为大家介绍PHP中常用的图像操作指南。一、图像处理的基本原理在图像处理的过程中,主...
    99+
    2023-05-21
    指南 PHP 图像操作
  • Windows 7系统中安全模式下的操作指南介绍
      Win7安全模式进入和winXP的操作类似,方法一:开机在进入Windows系统启动画面之前按下F8键;方法二:启动计算机时按住CTRL键。就会出现系统多操作启动菜单,这个时候你只需要选择“SafeMo...
    99+
    2023-05-29
    Windows 7 系统 安全模式 操作指南 操作 模式 指南 7系统
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作