Json是一种轻量级的数据交换格式。通俗的说,在我们许多项目中,前后端之间的数据通信格式就是Json。
后端在取到数据对数据进行加工之后,将此数据json.Marshal一下,也就是将此数据转为Json格式,然后将此Json格式的数据返回给前端,前端拿到Json之后会进行json.UnMarshal,也就是将Json文件转为原来的数据。然后经过一系列操作渲染到页面上。
这里写了一段代码来演示一下以上这个过程(Go语言):
package main
import (
"fmt"
"encoding/json"
)
type Student struct {
Name string
Age int
Guake bool
Classes []string
Price float32
}
func (s * Student)ShowStu() {
fmt.Println("show Student :")
fmt.Println("\tName\t:", s.Name)
fmt.Println("\tAge\t:", s.Age)
fmt.Println("\tGuake\t:", s.Guake)
fmt.Println("\tPrice\t:", s.Price)
fmt.Printf("\tClasses\t: ")
for _, a := range s.Classes {
fmt.Printf("%s ", a)
}
fmt.Println("")
}
func main() {
st := &Student {
"Xiao Ming",
16,
true,
[]string{"Math", "English", "Chinese"},
9.99,
}
fmt.Println("before JSON encoding :")
st.ShowStu()
b, err := json.Marshal(st)
if err != nil {
fmt.Println("encoding faild")
} else {
fmt.Println("encoded data : ")
fmt.Println(b)
fmt.Println(string(b))
}
ch := make(chan string, 1)
go func(c chan string, str string){
c <- str
}(ch, string(b))
strData := <-ch
fmt.Println("--------------------------------")
stb := &Student{}
stb.ShowStu()
err = json.Unmarshal([]byte(strData), &stb)
if err != nil {
fmt.Println("Unmarshal faild")
} else {
fmt.Println("Unmarshal success")
stb.ShowStu()
}
}
代码运行结果如下:
刚开始我觉得特别奇怪的是在结构体转为Json格式之后,应该是打印出来Json格式的数据,但是为什么是那一行数字,并且只有字符串化之后才能显示出是Json格式的数据。
后来才发现,字节数组其实就是下面Json格式数据的ASII码,123就是{ ,34就是” 。
字符串化就将字节数组里的ASII码以字符的形式打印出来了。