Go_Json_Unmarshal_Marshal

来源:互联网 发布:apl美皇公司知乎 编辑:程序博客网 时间:2024/05/25 01:34

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 mainimport ("encoding/json""fmt")func main() {type Person struct {Name   stringAge    intGender bool}//unmarshal to structvar p Personvar str = `{"Name":"junbin", "Age":21, "Gender":true}`json.Unmarshal([]byte(str), &p)//result --> junbin : 21 : truefmt.Println(p.Name, ":", p.Age, ":", p.Gender)// unmarshal to slice-structvar ps []Personvar aJson = `[{"Name":"junbin", "Age":21, "Gender":true},{"Name":"junbin", "Age":21, "Gender":true}]`json.Unmarshal([]byte(aJson), &ps)//result --> [{junbin 21 true} {junbin 21 true}] len is 2fmt.Println(ps, "len is", len(ps))// unmarshal to map[string]interface{}var obj interface{} // var obj map[string]interface{}json.Unmarshal([]byte(str), &obj)m := obj.(map[string]interface{})//result --> junbin : 21 : truefmt.Println(m["Name"], ":", m["Age"], ":", m["Gender"])//unmarshal to slicevar strs string = `["Go", "Java", "C", "Php"]`var aStr []stringjson.Unmarshal([]byte(strs), &aStr)//result --> [Go Java C Php]  len is 4fmt.Println(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 mainimport ("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         intGender      bool `json:",omitempty"`Profile     stringOmitContent 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 := json.Marshal(&p); err != nil {panic(err)} else {//result --> {"username":"brainwu","Age":21,"Gender":true,"Profile":"I am Wujunbin","Count":"0"}fmt.Println(string(bs))}var p2 *Person = &Person{Name:        "brainwu",Age:         21,Profile:     "I am Wujunbin",OmitContent: "OmitConent",}if bs, err := json.Marshal(&p2); err != nil {panic(err)} else {//result --> {"username":"brainwu","Age":21,"Profile":"I am Wujunbin","Count":"0"}fmt.Println(string(bs))}// slice 序列化为jsonvar aStr []string = []string{"Go", "Java", "Python", "Android"}if bs, err := json.Marshal(aStr); err != nil {panic(err)} else {//result --> ["Go","Java","Python","Android"]fmt.Println(string(bs))}//map 序列化为jsonvar m map[string]string = make(map[string]string)m["Go"] = "No.1"m["Java"] = "No.2"m["C"] = "No.3"if bs, err := json.Marshal(m); err != nil {panic(err)} else {//result --> {"C":"No.3","Go":"No.1","Java":"No.2"}fmt.Println(string(bs))}}

0 0
原创粉丝点击