首页
学习
活动
专区
工具
TVP
发布

Go JSON

作者头像
icepy
发布2019-06-24 20:29:59
9540
发布2019-06-24 20:29:59
举报
文章被收录于专栏:子曰五溪子曰五溪

如今在网络编程中JSON这种数据格式占据了较大的市场,如果不出意外,几乎新开发的数据交互,都会使用JSON这种轻量级的数据格式来处理数据交互。所以,怎么解析,转换JSON,成了大多数语言的一种标准模块。今天,我想给大家分享的是Go语言里的标准库"encoding/json"。

转换对应表:

  • bool类型 转换成JSON中的boolean
  • 整型,浮点型转换成JSON中的Number
  • 字符串转换成JSON中的字符串(""而不是'')
  • 结构体转换成JSON中的Object
  • []byte 会先base64然后转换成JSON中的字符串(""而不是'')
  • map 转换成JSON中的Object
  • interface{} 会按内部的类型进行实际转换
  • nil 会转换成JSON中的Null

encodeing/json几乎常用的就两个方法:

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

顾名思义“Marshal”将Go对象进行转换成JSON,而"Unmarshal"则是将JSON转换成Go对象。

不过在转换的过程中,如果我们定义的是结构体,跟Map会有一些不同,以下几点是要注意的:

  • 结构体的成员必须是大写开头
  • 使用Marshal时会按结构体成员的变量名做为Key
  • Unmarshal时会自动匹配结构体成员,大小写不敏感,如果JSON中有多余字段,会直接抛弃,如果缺少某个字段,则会忽略对结构体成员赋值

根据这些规则来说,如果在使用时稍微不注意,可能会有意想不到的错误,举个例子,有一个请求,需要传入参数{"name":"", "age":""},我们定义一个struct结构如下:

type Request struct{   
    Name string
   Age string
}

在进行Marshal会用结构体的成员变量名做为Key,于是我们会得到{"Name":"","Age":""} ,这和请求需要的参数是不同的,所以我们还需要使用到structTag,为了对应关系可以一一对应上,我们需要手动的为结构体打上Tag,才能转换到正确的JSON。

type Request struct{   
    Name string  `json:"name"`
   Age string  `json:"age"`
}

这种情况,几乎是要给对方传递参数时才用到,多数情况下,如果是Unmarshal,因为大小写不敏感,所以不需要structTag,但是,如果JSON的key是比如"f_name",这种,那么,依然需要structTag

type Request struct{   
    Name string  `json:"f_name"`
   Age string  `json:"age"`
}

structTag还有一些其他有用的属性,比如:

  • omitempty 如果JSON字段为空则忽略
  • - 直接忽略

有时候你想更灵活的使用JSON,这个时候就要用到json.RawMessage,多数情况下,我们不会使用到它。加上在JSON中,有一个字段的格式是未知的,比如可能是string,也可能是int,那么这个时候就要用到*json.RawMessage了。


本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-04-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 子曰五溪 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档