注意一个点:结构体内的私有属性不能被json包访问,如果结构体内部的属性都要就行转换,需要全部为公有属性(开头字符大写)
(结构体 ----> JSON格式字符串)
(JSON格式字符串 ----> 结构体)
Golang 中 的 序 列 化 和 反 序 列 化 主 要 通 过 "encoding/json" 包 中 的 json.Marshal() 和json.Unmarshal()方法实现;
package main
import (
"encoding/json"
"fmt"
)
type Person struct{
Name string
Gender string
Age int
}
func main() {
var p1 = Person{
Name: "奥特曼",
Gender: "男",
Age: 17,
}
fmt.Printf("%#v\n",p1)
jsonByte,_ := json.Marshal(p1)
jsonStr := string(jsonByte)
fmt.Printf("%#v", jsonStr)
}
错误案例如下:
package main
import (
"encoding/json"
"fmt"
)
type Person struct{
Name string
Gender string
age int
}
func main() {
var p1 = Person{
Name: "奥特曼",
Gender: "男",
age: 17,
}
fmt.Printf("%#v\n",p1)
jsonByte,_ := json.Marshal(p1)
jsonStr := string(jsonByte)
fmt.Printf("%#v", jsonStr)
}
返回一个err;
如果err为空,转换成功;
err非空,转换失败
package main
import (
"encoding/json"
"fmt"
)
type Person struct{
Name string
Gender string
age int
}
func main() {
var str = `{"Name":"奥特曼","Gender":"男","Age":17}`
var p2 Person
err := json.Unmarshal([]byte(str), &p2)
if err != nil {
fmt.Println(err)
}
fmt.Printf("%#v\n", p2)
fmt.Println(p2.Name)
}
通过指定 tag 实现 json 序列化该字段时的 key
package main
import (
"encoding/json"
"fmt"
)
type Person struct{
Name string `json:"name"`
Gender string `json:"gender"`
Age int `json:"age"`
}
type Group struct{
Intrasting string
Person []Person
}
func main() {
h := Group{
Intrasting: "绘画",
Person: make([]Person, 0),
}
for i := 17; i < 20; i++ {
p := Person{
Name :fmt.Sprintf("编号%v", i), //字符串类型
Gender:"男",
Age : i+1,
}
h.Person = append(h.Person, p) //将P里的东西,添加到实例化的h后的切片内
}
// fmt.Println(c)
strByte, err := json.Marshal(h)
if err != nil {
fmt.Println(err)
} else {
strJson := string(strByte)
fmt.Println(strJson)
}
}
逆序退回
package main
import (
"encoding/json"
"fmt"
)
type Person struct{
Name string `json:"name"`
Gender string `json:"gender"`
Age int `json:"age"`
}
type Group struct{
Intrasting string
Person []Person
}
func main() {
jsonStr := `{"Intrasting":"绘画","Person":[{"name":"编号17","gender":"男","age":18},{"name":"编号18","gender":"男","age":19},{"name":"编号19","gender":"男","age":20}]}`
var h = &Group{}
err := json.Unmarshal([]byte(jsonStr), h)
if err != nil {
fmt.Println(err)
} else {
fmt.Printf("%#v\n", h)
fmt.Printf("%v", h.Intrasting)
}
}