本文已参与 周末学习计划,点击查看详情
这是我参与更文挑战的第2天,活动详情查看:更文挑战
常用方法
Marshal 方法介绍
func Marshal(v interface{}) ([]byte, error)
复制代码
该方法会递归遍历v, 一般情况下,该方法会默认地按照如下对应关系去序列化和反序列化数据。
- boolean —— JSON booleans
- float point、integer、number —— JSON numbers
- string —— JSON strings (会被强制编码为UTF-8,所以嵌入在HTML中使用也是安全的。例如”<“会被替换为 “\u003c”,配置了SetEscapeHTML(false)的时候就不替换了。)
- array、slice —— JSON arrays
- struct —— JSON objects
结构体的初始化有点特别,下面详细看看。
// myName就是编码后的这个字段的key
Field int `json:"myName"`
// myName依然是key,但是由于有omitempty关键字,所以当字段值为空的时候,会忽略掉这个字段
Field int `json:"myName,omitempty"`
// 值为空时会跳过这个字段,由于没有指定key,会用Field作为key
Field int `json:",omitempty"`
// 这个字段会被忽略掉
Field int `json:"-"`
// 注意和上面不一样哦,这样写的话,字段名是-
Field int `json:"-,"`
复制代码
还有另外一种写法. 字段以 JSON 形式存储在 JSON 编码的字符串中。它仅适用于字符串、浮点、整数或布尔类型的字段。在与 JavaScript 程序通信时,有时会使用这种额外的编码级别.
Int64String int64 `json:",string"`
复制代码
- map —— JSON objects (需要注意map的key一定是可比较的类型,不过这算是golang的知识)
- 指针 —— 该指针对应的值
- channel、function不能被编码。
有一个小问题:JSON可以处理循环数据结构吗?可以看下这个方法的第一句介绍。
写个小例子试一试
type Xiaowu struct {
Age float32 `json:"aGe"`
Color string `json:"color,omitempty"`
character Com `json:"character"`
}
type Com struct {
Lovely bool `json:"lovely,omitempty"`
Cute bool `json:"cute,omitempty"`
Naughty string `json:"-"`
}
func main() {
miao := Xiaowu{
Age: 0.5,
Color: "grey",
character: Com{
Lovely: true,
Naughty: "true",
},
}
lovelyMiao,_ := json.Marshal(miao)
log.Println("miao :",string(lovelyMiao))
}
复制代码
输出是:
miao : {"aGe":0.5,"color":"grey"}
复制代码
阿哦,好像不符合预期。
Emm…
你看没打印出来的字段,开头字母是小写的,是不能够被编码的哦。修改后输出为
miao : {"aGe":0.5,"color":"grey","character":{"lovely":true}}
复制代码
好啦,今天就到这里啦。每天学习一点点也好啊,早点休息:) 明天来看看Unmarshal吧。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END