微信号:fed-talk

介绍:公众号开通于2016年,内容起于前端而不止于前端.

Go JSON

2018-04-18 13:41 icepy

如今在网络编程中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了。




长按二维码关注公众号:

你也可以关注我的新浪微博,搜索i_icepy,很期待和大家交流

 
象尘说 更多文章 Go 标准库 Go 如何调试你的应用程序 Go 函数也是一等公民 Go Echo Web Framework Go struct interface
猜您喜欢 使用 Server-Side Swift 开发 RESTful API Python函数接口的一些设计心得 美翻了,诺贝尔获奖证书简直是艺术品! Android设计模式之观察者模式 一本书精通Python自然语言处理