Go按照RFC 4627的标准实现了一个json编解码的标准库
func Unmarshal(data []byte, v interface{}) error
Unmarshal用于反序列化json的函数 根据data将数据反序列化到传入的对象中
仔细查看代码中的四种情况
1 将json反序列化成struct对象
2 将json反序列化到可以存储struct的slice中
3 将json 反序列化到map中
4 将json反序列化到slice中
package main
import (
"encoding/json"
"fmt"
)
func main() {
type Person struct {
Name string
Age int
Gender bool
}
//unmarshal to struct
var p Person
var str = `{"Name":"junbin", "Age":21, "Gender":true}`
([]byte(str), &p)
//result --> junbin : 21 : true
(, ":", , ":", )
// unmarshal to slice-struct
var ps []Person
var aJson = `[{"Name":"junbin", "Age":21, "Gender":true},
{"Name":"junbin", "Age":21, "Gender":true}]`
([]byte(aJson), &ps)
//result --> [{junbin 21 true} {junbin 21 true}] len is 2
(ps, "len is", len(ps))
// unmarshal to map[string]interface{}
var obj interface{} // var obj map[string]interface{}
([]byte(str), &obj)
m := obj.(map[string]interface{})
//result --> junbin : 21 : true
(m["Name"], ":", m["Age"], ":", m["Gender"])
//unmarshal to slice
var strs string = `["Go", "Java", "C", "Php"]`
var aStr []string
([]byte(strs), &aStr)
//result --> [Go Java C Php] len is 4
(aStr, " len is", len(aStr))
}
func Marshal(v interface{}) ([]byte, error)
Marshal 用于将struct对象序列化到json对象中
下面这个例子讲解了以下几个例子
1 给field指定别名
2 序列化时忽略字段
3 序列化时忽略值为zero value的字段
4 序列化时 将int类型的值 转换成string
5 slice序列化为json
6 map序列化为json
package main
import (
"encoding/json"
"fmt"
)
//tag中的第一个参数是用来指定别名
//比如Name 指定别名为 username `json:"username"`
//如果不想指定别名但是想指定其他参数用逗号来分隔
//omitempty 指定到一个field时
//如果在赋值时对该属性赋值 或者 对该属性赋值为 zero value
//那么将Person序列化成json时会忽略该字段
//- 指定到一个field时
//无论有没有值将Person序列化成json时都会忽略该字段
//string 指定到一个field时
//比如Person中的Count为int类型 如果没有任何指定在序列化
//到json之后也是int 比如这个样子 "Count":0
//但是如果指定了string之后序列化之后也是string类型的
//那么就是这个样子"Count":"0"
type Person struct {
Name string `json:"username"`
Age int
Gender bool `json:",omitempty"`
Profile string
OmitContent string `json:"-"`
Count int `json:",string"`
}
func main() {
var p *Person = &Person{
Name: "brainwu",
Age: 21,
Gender: true,
Profile: "I am Wujunbin",
OmitContent: "OmitConent",
}
if bs, err := (&p); err != nil {
panic(err)
} else {
//result --> {"username":"brainwu","Age":21,"Gender":true,"Profile":"I am Wujunbin","Count":"0"}
(string(bs))
}
var p2 *Person = &Person{
Name: "brainwu",
Age: 21,
Profile: "I am Wujunbin",
OmitContent: "OmitConent",
}
if bs, err := (&p2); err != nil {
panic(err)
} else {
//result --> {"username":"brainwu","Age":21,"Profile":"I am Wujunbin","Count":"0"}
(string(bs))
}
// slice 序列化为json
var aStr []string = []string{"Go", "Java", "Python", "Android"}
if bs, err := (aStr); err != nil {
panic(err)
} else {
//result --> ["Go","Java","Python","Android"]
(string(bs))
}
//map 序列化为json
var m map[string]string = make(map[string]string)
m["Go"] = "No.1"
m["Java"] = "No.2"
m["C"] = "No.3"
if bs, err := (m); err != nil {
panic(err)
} else {
//result --> {"C":"No.3","Go":"No.1","Java":"No.2"}
(string(bs))
}
}