json是前后端交互不可缺少的數(shù)據(jù)格式
生成json可以用Marshal
通過(guò)結(jié)構(gòu)體生成json
func Marshal(v interface{}) ([]byte, error)
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"name"`
Hobby string `json:"hobby"`
}
func main() {
p := Person{"5lmh.com", "女"}
// 編碼json
b, err := json.Marshal(p)
if err != nil {
fmt.Println("json err ", err)
}
fmt.Println(string(b))
// 格式化輸出
b, err = json.MarshalIndent(p, "", " ")
if err != nil {
fmt.Println("json err ", err)
}
fmt.Println(string(b))
}
通過(guò)map生成json
package main
import (
"encoding/json"
"fmt"
)
func main() {
student := make(map[string]interface{})
student["name"] = "5lmh.com"
student["age"] = 18
student["sex"] = "man"
b, err := json.Marshal(student)
if err != nil {
fmt.Println(err)
}
fmt.Println(b)
}
解碼json使用json.Unmarshal()函數(shù)可以對(duì)一組數(shù)據(jù)進(jìn)行JSON格式的解碼
func Unmarshal(data []byte, v interface{}) error
示例解析到結(jié)構(gòu)體
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Age int `json:"age,string"`
Name string `json:"name"`
Niubility bool `json:"niubility"`
}
func main() {
// 假數(shù)據(jù)
b := []byte(`{"age":"18","name":"5lmh.com","marry":false}`)
var p Person
err := json.Unmarshal(b, &p)
if err != nil {
fmt.Println(err)
}
fmt.Println(p)
}
示例解析到interface
package main
import (
"encoding/json"
"fmt"
)
func main() {
// int和float64都當(dāng)float64
b := []byte(`{"age":1.3,"name":"5lmh.com","marry":false}`)
// 聲明接口
var i interface{}
err := json.Unmarshal(b, &i)
if err != nil {
fmt.Println(err)
}
// 自動(dòng)轉(zhuǎn)到map
fmt.Println(i)
// 可以判斷類型
m := i.(map[string]interface{})
for k, v := range m {
switch vv := v.(type) {
case float64:
fmt.Println(k, "是float64類型", vv)
case string:
fmt.Println(k, "是string類型", vv)
default:
fmt.Println("其他")
}
}
}