结构体序列化和反序列化事例
func Marshal(in interface{}) (out []byte, err error)
func Unmarshal(p []byte, v interface{}) error
注意事项
1,结构体的私有字段(小写字段不会被编解码)
2,json tag,struct字段中的别名
3,json 对象的 key 必须是字符串
4,解码Unmarshal传递的字段是指针

简单的字符串序列化
package main
import (
"encoding/json"
"fmt"
)
func main() {
var x = 10
var name = "xiaoming"
var b = true
json_str1, _ := json.Marshal(x)
json_str2, _ := json.Marshal(name)
json_str3, _ := json.Marshal(b)
fmt.Printf("%#v\n", string(json_str1))
fmt.Printf("%#v\n", string(json_str2))
fmt.Printf("%#v\n", string(json_str3))
}
结果
"10"
"\"xiaoming\""
"true"
结构体序列化
package main
import (
"encoding/json"
"fmt"
)
type addr struct {
Province string
City string
}
type stu struct {
Name string `json:"name"`
Age int
Addr addr
}
func main() {
var stu01 = stu{Name: "xiaoxiao", Age: 18, Addr: addr{Province: "hehe", City: "beijing"}}
json_str02, _ := json.Marshal(stu01)
fmt.Printf("%#v", string(json_str02))
}
结果
"{\"name\":\"xiaoxiao\",\"Age\":18,\"Addr\":{\"Province\":\"hehe\",\"City\":\"beijing\"}}"
隐私字段
结构体中字段大写开头表示可公开访问,小写表示私有(仅在定义当前结构体的包中可访问)
package main
import (
"encoding/json"
"fmt"
)
type addr struct {
Province string
City string
}
type stu struct {
name string //隐私字段,结果不显示
age int //隐私字段,结果不显示
Addr addr
}
func main() {
var stu01 = stu{name: "xiaoxiao", age: 18, Addr: addr{Province: "hehe", City: "beijing"}}
json_str02, _ := json.Marshal(stu01)
fmt.Printf("%#v", string(json_str02))
}
结果(小写字段不显示)
"{\"Addr\":{\"Province\":\"hehe\",\"City\":\"beijing\"}}"
结构体标签
package main
import (
"encoding/json"
"fmt"
)
type addr struct {
Province string
City string
}
type stu struct {
Name string `json:"aaa"` //tag标签
Age int `json:"bbb"` //指定标签
Addr addr
}
func main() {
var stu01 = stu{Name: "xiaoxiao", Age: 18, Addr: addr{Province: "hehe", City: "beijing"}}
json_str02, _ := json.Marshal(stu01)
fmt.Printf("%#v", string(json_str02))
}
结果
"{\"aaa\":\"xiaoxiao\",\"bbb\":18,\"Addr\":{\"Province\":\"hehe\",\"City\":\"beijing\"}}"
反序列化
package main
import (
"encoding/json"
"fmt"
)
type addr struct {
Province string
City string
}
type stu struct {
Name string `json:"aaa"`
Age int
Addr addr
}
func main() {
var data = `{"aaa":"xiaoxiao","Age":18,"Addr":{"Province":"hehe","City":"beijing"}}`
var stu02 stu
json.Unmarshal([]byte(data), &stu02)
fmt.Printf("%#v", stu02)
}
结果
main.stu{Name:"xiaoxiao", Age:18, Addr:main.addr{Province:"hehe", City:"beijing"}}
