实现

Json Marshal:将数据编码成json字符串

type Stu struct {Name  string `json:"name"`Age   intHIgh  boolsex   stringClass *Class `json:"class"`
}type Class struct {Name  stringGrade int
}func main() {//实例化一个数据结构,用于生成json字符串stu := Stu{Name: "张三",Age:  18,HIgh: true,sex:  "男",}//指针变量cla := new(Class)cla.Name = "1班"cla.Grade = 3stu.Class=cla//Marshal失败时err!=niljsonStu, err := json.Marshal(stu)if err != nil {fmt.Println("生成json字符串错误")}//jsonStu是[]byte类型,转化成string类型便于查看fmt.Println(string(jsonStu))
}

结果

{"name":"张三","Age":18,"HIgh":true,"class":{"Name":"1班","Grade":3}}

从结果中可以看出

1.只要是可导出成员(变量首字母大写),都可以转成json。因成员变量sex是不可导出的,故无法转成json。

2.如果变量打上了json标签,如Name旁边的 `json:"name"` ,那么转化成的json key就用该标签“name”,否则取变量名作为key,如“Age”,“HIgh”。

3.bool类型也是可以直接转换为json的value值。Channel, complex 以及函数不能被编码json字符串。当然,循环的数据结构也不行,它会导致marshal陷入死循环。

4.指针变量,编码时自动转换为它所指向的值,如cla变量。
(当然,不传指针,Stu struct的成员Class如果换成Class struct类型,效果也是一模一样的。只不过指针更快,且能节省内存空间。)

Json: UnMarshal 的方法

用法:将json数据解析成对应的数据结构

1.json中的“引号需要\进行转义,否则会编译报错

2.方法需要传入两个参数,第一个参数是json的字符串,第二个参数是接受解析的数据结构,

参数必须是指针,否则无法接受解析的数据

进行总结:

json字符串解析时,需要一个“接收体”接受解析后的数据,且Unmarshal时接收体必须传递指针。否则解析虽不报错,但数据无法赋值到接受体中。如这里用的是StuRead{}接收。

解析时,接收体可自行定义。json串中的key自动在接收体中寻找匹配的项进行赋值。匹配规则是:

先查找与key一样的json标签,找到则赋值给该标签对应的变量(如Name)。
没有json标签的,就从上往下依次查找变量名与key一样的变量,如Age。或者变量名忽略大小写后与key一样的变量。如HIgh,Class。第一个匹配的就赋值,后面就算有匹配的也忽略。
(前提是该变量必需是可导出的,即首字母大写)。
不可导出的变量无法被解析(如sex变量,虽然json串中有key为sex的k-v,解析后其值仍为nil,即空值)

当接收体中存在json串中匹配不了的项时,解析会自动忽略该项,该项仍保留原值。如变量Test,保留空值nil。

你一定会发现,变量Class貌似没有解析为我们期待样子。因为此时的Class是个interface{}类型的变量,而json串中key为CLASS的value是个复合结构,不是可以直接解析的简单类型数据(如“张三”,18,true等)。所以解析时,由于没有指定变量Class的具体类型,json自动将value为复合结构的数据解析为map[string]interface{}类型的项。也就是说,此时的struct Class对象与StuRead中的Class变量没有半毛钱关系,故与这次的json解析没有半毛钱关系。

json的Marshal 和 UnMarshal 的相关推荐

  1. 【cue语言系列】03.json marshal和unmarshal

    文章目录 需求 简单版 复杂版 进阶版2:一级拼接 进阶版2的另一种写法 进阶版3:两级拼接 进阶版3的另一种写法 需求 初始有一个json 需要cue文件来帮助拼接一段形成一个新的json 简单版 ...

  2. Go的json解析:Marshal与Unmarshal

    简介 Json(Javascript Object Nanotation)是一种数据交换格式,常用于前后端数据传输.任意一端将数据转换成json 字符串,另一端再将该字符串解析成相应的数据结构,如st ...

  3. encoding/json 方法Marshal的说明

    地址:https://studygolang.com/pkgdoc func Marshal func Marshal(v interface{}) ([]byte, error) Marshal函数 ...

  4. Go --- Marshal与Unmarshal基础用法

    go语言本身为我们提供了json的工具包"encoding/json". 前言: Json–Javascript Object Nanotation 是一种数据交换格式,经常用于前 ...

  5. Golang json 中文marshal

    今天遇到了坑, golang 直接json.Marshal 中文 客户端不解析.必须是ASCII码才可以,所以学习了下,示例如下: package mainimport ("encoding ...

  6. marshal 和 unmarshal(一)

    定义 marshal:直译为"编排", 在计算机中特 指将数据按某种描述格式编排出来,通常来说一般是从非文本格式到文本格式的数据转化.unmarshal自然是指marshal的逆过 ...

  7. 【带你上手云原生体系】第二部分:Go语言从入门到精通

    [带你上手云原生体系]第一部分:文章简介 及 云原生思维概览 [带你上手云原生体系]第二部分:Go语言从入门到精通 [带你上手云原生体系]第三部分:Docker从入门到精通 [带你上手云原生体系]第四 ...

  8. 已有生成随机数函数生成扩展_如何创建没有副作用的随机数生成器函数

    已有生成随机数函数生成扩展 Must you be thinking about this title? Is that even possible? The random generator has ...

  9. Golang常用库学习

    Golang常用库学习 标准库fmt 标准库log 标准库time 标准库strconv 标准库 testing 单元测试 简单测试 单元测试覆盖率统计 表格驱动测试 性能(基准)测试 标准库 os ...

最新文章

  1. 微软麻将AI Suphx或引入“凤凰房”,与其他AI对打
  2. R获取股票数据并进行进行可视化分析
  3. 【VC基础】 4、变式表(Variant Table)
  4. 【深度学习】你不知道的车牌识别系统
  5. 数据结构(五)层次遍历
  6. 使用Ansible进行硬件引导
  7. linux进程tss和ldt,x86体系下linux中的任务切换与TSS
  8. cas-server Jdbc 连接读取用户(5)
  9. python在线学习直播-一对多直播系统开发,百万用户在线,直播弹幕系统是如何实现的?...
  10. 深度学习TF—6.神经网络过拟合及reduce overfitted
  11. unity 多选枚举
  12. ffmpeg 命令实现h264文件 与 mp4 文件的转换
  13. HBuilderX前端html功能应用
  14. Troubleshooting: WAITED TOO LONG FOR A ROW CACHE ENQUEUE LOCK! (文档 ID 278316.1)
  15. windows下清除文件批处理命令
  16. 10行代码实现微信群消息同步(wxpy)
  17. python象棋游戏代码_python学员作品-象棋游戏
  18. MyCat是使用介绍
  19. Retrofit 使用
  20. tcpdump,tshark常用命令(一)

热门文章

  1. qt中如何修改日志输出级别?
  2. DDD—上下文映射图
  3. mysql的selectwhere语句_(MySQL笔记)SELECT语句的WHERE子句详解
  4. 2023年外贸业务员的职业发展前景
  5. linux微信聊天输入框文字方块乱码
  6. C/C++语言中无符号(unsigned)与有符号运算问题
  7. 微软实习生日记 第一篇 初识微软
  8. layui单选框去掉选中状态
  9. goland常用配置
  10. gaussdb 数据库连接工具【gsql 变量、sql代换、提示符、相关环境变量】【01】