耐心和持久胜过激烈和狂热。

哈喽大家好,我是陈明勇,今天分享的内容是 Go 结构体 与 JSON 之间的转换。如果本文对你有帮助,不妨点个赞,如果你是 Go 语言初学者,不妨点个关注,一起成长一起进步,如果本文有错误的地方,欢迎指出!

前言

在日常开发中,我们往往会将 JSON 解析成对应的结构体,反之也会将结构体转成 JSON。接下来本文会通过 JSON 包的两个函数,来介绍 JSON 与结构体之间的转换。

结构体转 JSON

Marshal(v any) ([]byte, error):将 v 转成 JSON 数据,以 []byte 的形式返回。

import ("encoding/json""fmt"
)type User struct {Name           stringAge            intHeight         float64Weight         *float64Child          boolmarriageStatus string
}func main() {weight := 120.5user := User{Name:           "gopher",Age:            18,Height:         180.5,Weight:         &weight,Child:          false,marriageStatus: "未婚",}jsonBytes, err := json.Marshal(user)if err != nil {fmt.Println("error: ", err)return}fmt.Println(string(jsonBytes)) // {"Name":"gopher","Age":18,"Height":180.5,"Weight":120.5,"Child":false}
}

执行结果:
{"Name":"gopher","Age":18,"Height":180.5,"Weight":120.5,"Child":false}
根据结果可知:

  • 不可导出字段(字段名以小写字母开头),是不能被转成 JSONkey 的,这也符合 Go 的语法规定,以小写字母开头的变量或结构体字段等,不能在包外被访问。
  • 转换后的字段名,与结构体字段的名字一样。
  • 如果字段是指针类型,转换后的值为指针指向的字段值。

如果我们想要指定字段转换之后的命名,或者将一个可导出的字段进行忽略,可以通过给结构体字段打上 JSON 标签的方式实现。

import ("encoding/json""fmt"
)type User struct {Name           string   `json:"name"`Age            int      `json:"age"`Height         float64  `json:"height"`Weight         *float64 `json:"weight"`Child          bool     `json:"child"`MarriageStatus string   `json:"-"`
}func main() {weight := 120.5user := User{Name:           "gopher",Age:            18,Height:         180.5,Weight:         &weight,Child:          false,MarriageStatus: "未婚",}jsonBytes, err := json.Marshal(user)if err != nil {fmt.Println("error: ", err)return}fmt.Println(string(jsonBytes)) // {"name":"gopher","age":18,"height":180.5,"weight":120.5,"child":false}
}

通过给结构体字段定打上 JSON 标签,可指定转成 JSON 后的字段名,如果 JSON 标签的值为 -,则在转换 JSON 时忽略此字段。

JSON 解析结构体

Unmarshal(data []byte, v any) error:将 JSON 解析成指定的结构体。

import ("encoding/json""fmt"
)type User struct {Name           string  `json:"name"`Age            int     `json:"age"`Height         float64 `json:"height"`Child          bool    `json:"-"`marriageStatus string
}func main() {userStr := `{"name": "gopher","age": 18,"height": 180.5,"child": true,"marriageStatus": "未婚"}`user := &User{}err := json.Unmarshal([]byte(userStr), &user)if err != nil {fmt.Println("error: ", err)return}fmt.Printf("%#v", user) // &main.User{Name:"gopher", Age:18, Height:180.5, Child:false, marriageStatus:""}
}

执行结果:&main.User{Name:"gopher", Age:18, Height:180.5, Child:false, marriageStatus:""}
根据结果可知:

  • 使用Unmarshal函数时,我们需要传入结构体的指针类型,否则结构体字段的值将不会被改变,因为底层是通过指针去修改结构体字段的值。
  • JSON 解析时,JSONkey 与结构体字段的匹配规则是:
    • 优先查找 JSON 标签值和 key 一样的,找到则将 value 赋值给对应字段。
    • 如果没有 JSON 标签值与 key 相匹配,则根据字段名进行匹配。
  • 可以发现,如果结构体字段是非导出字段或 JSON 标签的值为 -,将不会被匹配到。

小结

本文介绍了 Go 语言里,JSON 与结构体之间的转换。在结构体转 JSON 时,我们可以通过给字段打标签,指定转换后的 key 命名,需要注意的是,如果结构体的字段为非导出字段或字段的 JSON 标签值为 -,在转换 JSON 时,将会被忽略。反之 JSON 解析结构体时也是一样的。

Go 结构体与 JSON 之间的转换相关推荐

  1. golang 学习(二十四)结构体struct 和 json之间的转换

    结构体struct 和 json之间的转换 import ("encoding/json""fmt""math/rand""tes ...

  2. 处理实体与Map<String,Object>、json之间的转换

    处理实体与map,json之间的转换 实体与Map 实体与Map<String,Object>的转换 直接看代码,如下: package com.liu;import java.lang. ...

  3. json转php数组 在线,PHP数组和Json之间的转换

    http://www.cnblogs.com/itcx/p/3635612.html PHP数组和Json之间的转换 对象和Json之间的转换 json格式在开发中用的十分广泛.在php中json_e ...

  4. js解析json字符串、对象与json之间的转换

    前言 在数据传输流程中,json是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以,JSON对象和JSON字符串之间的相互转换是关键. js解析json字符串 // JSON字符串 'v ...

  5. FrontEnd——数组、字符串、JSON之间的转换和操作

    文章目录 简介 方案 1 插件或者说第三方库 1.1 flatted 1.2 circular-json(不推荐) 1.3 qs参数序列化 2 原生的方法 2.1 JSON.stringfy() 2. ...

  6. Go语言进阶,结构体与json字符串格式的互相转换

    对于结构体大家都很熟悉,是一种自定义类型,可以将不同类型的同属于这个类的属性(成员变量)集合在一起,换句话说这些成员变量属于键值对,那么这种也就是常见的json格式,我们来看下如何将结构体转成json ...

  7. go语言中结构体与json

    go语言中使用Marshal函数实现结构体json化,需要有一下两点注意 因为json化是在其他函数中完成,因此需要将结构体中的成员大写,这样才能在生成的结构体中有对应的元素 在结构体后面,如果有需要 ...

  8. C#结构体和字节数组的转换

    在写C#TCP通信程序时,发送数据时,只能发送byte数组,处理起来比较麻烦不说,如果是和VC6.0等写的程序通信的话,很多的都是传送结构体,在VC6.0中可以很方便的把一个char[]数组转换为一个 ...

  9. c++ tm结构体和time_t时间戳的转换

    贴一段简单的代码 #include <time.h> #include <stdio.h> #include <stdlib.h>int main() {struc ...

  10. 结构体和数组之间的映射关系

    由于数组和结构在内存空间上都是连续的,所以只要是结构体所占内存的大小和数组所占内存的大小是一致的情况下是可以做成相互映射的关系的,具体的原理就是,地址空间发生了变化,从一个地址空间取回来等大小的内存空 ...

最新文章

  1. python约瑟夫环问题给十个学生编号报到3者出列_趣味算法--约瑟夫环问题(示例代码)...
  2. 安师大计算机与信息学院导师,安徽师范大学数学计算机科学学院导师介绍:罗永龙...
  3. 如何避免贫穷和忙碌,在2018年你需要这样提升自己 2018年01月07日 00:00:00 2099 热文导读 | 点击标题阅读 Java和Android架构2017年总结:文章精选 吊炸天!74
  4. Dockerfile的介绍
  5. 2017,SAP向云看齐
  6. async/await 异步操作 .net csharp C#
  7. Agile in a Flash:重新定义纪律
  8. 查询ecshop网站代码排查方法_提升网站访问速度,提升网站访问速度,提升网站访问速度的个人经验分享...
  9. 图书馆管理系统的c语言,图书馆管理系统 c语言.doc
  10. Linux/Ubuntu20 安装 TP-link(RTL8812AU) 无线网卡驱动
  11. 从单机到分布式数据库存储系统的演进
  12. 基于单片机at89s52的频率计设计c语言程序,基于AT89S52单片机的数字频率计的设计...
  13. 基于XP系统的asp.net运行环境的安装与配置
  14. 房屋租赁合同模板2020 免费下载
  15. 1013: 求两点间距离(C语言)
  16. git memery 后 push到远程,如何回滚
  17. 【Natural Language Processing】语言模型训练工具Srilm的安装及使用简介
  18. git学习之时光穿梭机
  19. tensorflow出现如下错误:AttributeError: ‘module’ object has no attribute ‘merge_all_summaries’
  20. 英语小学口语测试软件,你们的小学英语口语测试怎么搞?

热门文章

  1. 积累原始资金只有三种途径
  2. 使用WPF创建一个Digg桌面应用
  3. 易查分怎么用?3分钟上手,轻松搞定
  4. 解决mysql 模糊搜索表情包 编码报错 Illegal mix of collations
  5. 【科技、商业和管理】看剧学创业:《硅谷》第六季第6-7集
  6. 爱立信以新的专利所有者身份加入Sisvel的DSL许可计划
  7. 树链剖分作业小结(上)
  8. 南开大学计算机宁博,重要参考数据:75所院校2020年报考人数汇总
  9. oracle冷迁移windows,windows下迁移oracle冷备份
  10. 房价暴涨的十年,老百姓到底赚了多少钱?