Go JSON
Posted 子曰五溪
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go JSON相关的知识,希望对你有一定的参考价值。
如今在网络编程中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 JSON的主要内容,如果未能解决你的问题,请参考以下文章
golang的xorm如何将[]map[string][]byte 格式的数据序列化成json输出