当前位置:首页 > 科技  > 软件

在Go语言中,这样使用Json的

来源: 责编: 时间:2024-05-11 09:20:39 311观看
导读Encode将一个对象编码成JSON数据,接受一个interface{}对象,返回[]byte和error:func Marshal(v interface{}) ([]byte, error)Marshal函数将会递归遍历整个对象,依次按成员类型对这个对象进行编码,类型转换规则如下:bool类型

Encode

将一个对象编码成JSON数据,接受一个interface{}对象,返回[]byte和error:KyT28资讯网——每日最新资讯28at.com

func Marshal(v interface{}) ([]byte, error)

Marshal函数将会递归遍历整个对象,依次按成员类型对这个对象进行编码,类型转换规则如下:KyT28资讯网——每日最新资讯28at.com

  • bool类型 转换为JSON的Boolean
  • 整数,浮点数等数值类型 转换为JSON的Number
  • string 转换为JSON的字符串(带""引号)
  • struct 转换为JSON的Object,再根据各个成员的类型递归打包
  • 数组或切片 转换为JSON的Array
  • []byte 会先进行base64编码然后转换为JSON字符串
  • map转换为JSON的Object,key必须是string
  • interface{} 按照内部的实际类型进行转换
  • nil 转为JSON的null
  • channel,func等类型 会返回UnsupportedTypeError
type ColorGroup struct {  ID  int  Name string  Colors []string } group := ColorGroup{  ID:  1,  Name: "Reds",  Colors: []string{"Crimson", "Red", "Ruby", "Maroon"}, } b, err := json.Marshal(group) if err != nil {  fmt.Println("error:", err) } os.Stdout.Write(b) Output: {"ID":1,"Name":"Reds","Colors":["Crimson","Red","Ruby","Maroon"]}

Decode

将JSON数据解码KyT28资讯网——每日最新资讯28at.com

func Unmarshal(data []byte, v interface{}) error

类型转换规则和上面的规则类似KyT28资讯网——每日最新资讯28at.com

var jsonBlob = []byte(`[  {"Name": "Platypus", "Order": "Monotremata"},  {"Name": "Quoll", "Order": "Dasyuromorphia"} ]`) type Animal struct {  Name string  Order string } var animals []Animal err := json.Unmarshal(jsonBlob, &animals) if err != nil {  fmt.Println("error:", err) } fmt.Printf("%+v", animals) Output: [{Name:Platypus Order:Monotremata} {Name:Quoll Order:Dasyuromorphia}]

结构体

结构体必须是大写字母开头的成员才会被JSON处理到,小写字母开头的成员不会有影响。KyT28资讯网——每日最新资讯28at.com

Mashal时,结构体的成员变量名将会直接作为JSON Object的key打包成JSON;Unmashal时,会自动匹配对应的变量名进行赋值,大小写不敏感。KyT28资讯网——每日最新资讯28at.com

Unmarshal时,如果JSON中有多余的字段,会被直接抛弃掉;如果JSON缺少某个字段,则直接忽略不对结构体中变量赋值,不会报错。KyT28资讯网——每日最新资讯28at.com

type Message struct {  Name string  Body string  Time int64  inner string } var m = Message{  Name: "Alice",  Body: "Hello",  Time: 1294706395881547000,  inner: "ok", } b := []byte(`{"nAmE":"Bob","Food":"Pickle", "inner":"changed"}`) err := json.Unmarshal(b, &m) if err != nil {  fmt.Printf(err.Error())  return} fmt.Printf("%v", m) Output: {Bob Hello 1294706395881547000 ok}

StructTag

如果希望手动配置结构体的成员和JSON字段的对应关系,可以在定义结构体的时候给成员打标签:KyT28资讯网——每日最新资讯28at.com

使用omitempty熟悉,如果该字段为nil或0值(数字0,字符串"",空数组[]等),则打包的JSON结果不会有这个字段。KyT28资讯网——每日最新资讯28at.com

type Message struct {  Name string `json:"msg_name"`  // 对应JSON的msg_name  Body string `json:"body,omitempty"` // 如果为空置则忽略字段  Time int64 `json:"-"`    // 直接忽略字段 } var m = Message{  Name: "Alice",  Body: "",  Time: 1294706395881547000, } data, err := json.Marshal(m) if err != nil {  fmt.Printf(err.Error())  return} fmt.Println(string(data)) Output: {"msg_name":"Alice"}

更灵活地使用JSONKyT28资讯网——每日最新资讯28at.com

使用json.RawMessage

json.RawMessage其实就是[]byte类型的重定义。可以进行强制类型转换。KyT28资讯网——每日最新资讯28at.com

现在有这么一种场景,结构体中的其中一个字段的格式是未知的:KyT28资讯网——每日最新资讯28at.com

type Command struct {  ID int  Cmd string  Args *json.RawMessage }

使用json.RawMessage的话,Args字段在Unmarshal时不会被解析,直接将字节数据赋值给Args。我们可以能先解包第一层的JSON数据,然后根据Cmd的值,再确定Args的具体类型进行第二次Unmarshal。KyT28资讯网——每日最新资讯28at.com

这里要注意的是,一定要使用指针类型*json.RawMessage,否则在Args会被认为是[]byte类型,在打包时会被打包成base64编码的字符串。KyT28资讯网——每日最新资讯28at.com

使用interface{}

interface{}类型在Unmarshal时,会自动将JSON转换为对应的数据类型:KyT28资讯网——每日最新资讯28at.com

JSON的boolean 转换为boolJSON的数值 转换为float64JSON的字符串 转换为stringJSON的Array 转换为[]interface{}JSON的Object 转换为map[string]interface{}JSON的null 转换为nil

需要注意的有两个。一个是所有的JSON数值自动转换为float64类型,使用时需要再手动转换为需要的int,int64等类型。第二个是JSON的object自动转换为map[string]interface{}类型,访问时直接用JSON ``Object的字段名作为key进行访问。再不知道JSON数据的格式时,可以使用interface{}。KyT28资讯网——每日最新资讯28at.com

自定义类型

如果希望自己定义对象的打包解包方式,可以实现以下的接口:KyT28资讯网——每日最新资讯28at.com

type Marshaler interface {  MarshalJSON() ([]byte, error) } type Unmarshaler interface {  UnmarshalJSON([]byte) error }

实现该接口的对象需要将自己的数据打包和解包。如果实现了该接口,json在打包解包时则会调用自定义的方法,不再对该对象进行其他处理。KyT28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-87985-0.html在Go语言中,这样使用Json的

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 万众期待!JavaScript 宣布 Signals 即将到来!颠覆性的 API !

下一篇: Python 对象有哪几种,我们可以从哪些角度进行分类呢?

标签:
  • 热门焦点
  • 红魔电竞平板评测:大屏幕硬实力

    前言:三年的疫情因为要上网课的原因激活了平板市场,如今网课的时代已经过去,大家的生活都恢复到了正轨,这也就意味着,真正考验平板电脑生存的环境来了。也就是面对着这种残酷的
  • 7月安卓手机性能榜:红魔8S Pro再夺榜首

    7月份的手机市场风平浪静,除了红魔和努比亚带来了两款搭载骁龙8Gen2领先版处理器的新机之外,别的也想不到有什么新品了,这也正常,通常6月7月都是手机厂商修整的时间,进入8月份之
  • 5月安卓手机好评榜:魅族20 Pro夺冠

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年5月1日至5月31日,仅限国内市场。第一名:魅族20 Pro好评率:97.50%不得不感慨魅族老品牌还
  • 消息称迪士尼要拍真人版《魔发奇缘》:女主可能也找黑人演员

    8月5日消息,迪士尼确实有点忙,忙着将不少动画改成真人版,继《美人鱼》后,真人版《白雪公主》、《魔发奇缘》也在路上了。据外媒消息称,迪士尼将打造真人版
  • ESG的面子与里子

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之三伏大幕拉起,各地高温预警不绝,但处于厄尔尼诺大“烤”之下的除了众生,还有各大企业发布的ESG报告。ESG是“环境保
  • 认真聊聊东方甄选:如何告别低垂的果实

    来源:山核桃作者:财经无忌爆火一年后,俞敏洪和他的东方甄选依旧是颇受外界关心的“网红”。7月5日至9日,为期5天的东方甄选“甘肃行”首次在自有App内直播,
  • 国行版三星Galaxy Z Fold5/Z Flip5发布 售价7499元起

    2023年8月3日,三星电子举行Galaxy新品中国发布会,正式在国内推出了新一代折叠屏智能手机三星Galaxy Z Fold5与Galaxy Z Flip5,以及三星Galaxy Tab S9
  • 3699元!iQOO Neo8 Pro顶配版今日首销:1TB UFS 4.0同价位唯一

    5月23日,iQOO推出了全新的iQOO Neo8系列,包含iQOO Neo8和iQOO Neo8 Pro两个版本,其中标准版搭载高通骁龙8+,而Pro版更是首发搭载了联发科天玑9200+旗舰
  • OPPO K11采用全方位护眼屏:三大护眼能力减轻视觉疲劳

    日前OPPO官方宣布,全新的OPPO K11将于7月25日正式发布,将主打旗舰影像,和同档位竞品相比,其最大的卖点就是将配备索尼IMX890主摄,堪称是2000档位影像表
Top