json易于机器解析和生产,并有效地提升网络传输效率,通常程序在网络传输时
会先将数据(结构体,map,slice等)序列化成json字符串,接收方得到json
字符串时,再反序列化恢复成原来的数据。
在js中,一起都是对象。因此,任何数据类型都可以通过json表示。
JSON键值对是用来保存数据的一种方式
{"firstName":"tom"}
json序列化:将有key-value结构的数据类型(结构体,map,slice等)序列化
成json字符串。
序列化
例1:
type Monster struct {
Name string
Age int
Birthday string
Sal float64
Skill string
}
func testStruct() {
monster := Monster{
Name: "Tom",
Age: 500,
Birthday: "2011-11-11",
Sal: 800.0,
Skill: "say hello",
}
data, err := json.Marshal(&monster)
if err != nil {
fmt.Printf("wrong! err = %v \n", err)
}
fmt.Printf("monster = %v \n", string(data))
}
例2:
func testMap() {
var a map[string]interface{}
a = make(map[string]interface{})
a["name"] = "红孩儿"
a["age"] = 30
a["address"] = "洪崖洞"
data, err := json.Marshal(a)
if err != nil {
fmt.Printf("序列化错误 err=%v\n", err)
}
fmt.Printf("a map 序列化后=%v\n", string(data))
}
例3:
func testSlice() {
var slice []map[string]interface{}
var m1 map[string]interface{}
m1 = make(map[string]interface{})
m1["name"] = "jack"
m1["age"] = "7"
m1["address"] = "北京"
slice = append(slice, m1)
var m2 map[string]interface{}
m2 = make(map[string]interface{})
m2["name"] = "tom"
m2["age"] = "20"
m2["address"] = [2]string{"墨西哥","夏威夷"}
slice = append(slice, m2)
data, err := json.Marshal(slice)
if err != nil {
fmt.Printf("序列化错误 err=%v\n", err)
}
fmt.Printf("slice 序列化后=%v\n", string(data))
}
反序列化
例1:
package main
import (
"fmt"
"encoding/json"
)
type Monster struct {
Name string
Age int
Birthday string
Sal float64
Skill string
}
func unmarshalStruct() {
str := "{\"Name\":\"牛魔王\",\"Age\":500,\"Birthday\":\"2011-11-11\",\"Sal\":8000,\"Skill\":\"牛魔拳\"}"
var monster Monster
err := json.Unmarshal([]byte(str), &monster)
if err != nil {
fmt.Printf("unmarshal err=%v\n", err)
}
fmt.Printf("反序列化后 monster=%v monster.Name=%v \n", monster, monster.Name)
}