基本介紹
json(JavaScript Object Notation) 是一種輕量級的數據交換格式,易於閱讀和編寫,同時也易於機器解析和生成 key-val
json 易於機器解析和生成,並有效的提升網絡傳輸效率,通常程序在網絡傳輸時,會先將數據(機構提,map等)序列化成json字符串,到接收方得到json字符串時,再反序列化回復成原來的數據類型(結構體,map等)
json格式
在js語言中,一切都是對象,因此,任何的數據類型都可以通過JSON來表示,例如字符串,數字,對象,數組,map,結構體等
JSON鍵值對是用來保存數據的一種方式,鍵值對組合中的鍵名寫在前面,並用"" 雙引號包裹,使用冒號: 分割,然后"值"
json序列化
結構體序列化
package main
import (
"encoding/json"
"fmt"
)
type Monster struct {
Name string
Age int
Birthday string
Sal float64
Skill string
}
func main() {
monster := Monster{
Name : "牛魔王",
Age : 500,
Birthday : "0253-11-11",
Sal : 8000.0,
Skill : "牛魔拳",
}
// 序列化函數
data,err := json.Marshal(&monster)
if err != nil{
fmt.Println("序列化錯誤",err)
}
fmt.Printf("monster序列化后的內容%v",string(data))
}
map序列化
package main
import (
"encoding/json"
"fmt"
)
type Monster struct {
Name string
Age int
Birthday string
Sal float64
Skill string
}
func main() {
var a map[string]interface{}
// 使用map需要先make
a = make(map[string]interface{})
a["name"] = "紅孩兒"
a["address"] = "火雲洞"
// 將map進行序列化
data,err := json.Marshal(a)
if err != nil{
fmt.Println("序列化失敗",err)
}
fmt.Println(string(data))
}
對切片序列化
package main
import (
"encoding/json"
"fmt"
)
type Monster struct {
Name string
Age int
Birthday string
Sal float64
Skill string
}
func main() {
// map切片
var z float64 = 1.24
var a []map[string]interface{}
var m1 map[string]interface{}
// 使用map需要先make
m1 = make(map[string]interface{})
m1["name"] = "紅孩兒"
m1["address"] = [2]string{"火雲洞","背景"}
a = append(a,m1)
// 將map進行序列化
data,err := json.Marshal(a)
data2,err := json.Marshal(z)
if err != nil{
fmt.Println("序列化失敗",err)
}
fmt.Println(string(data))
fmt.Printf("%v",string(data2))
}
基本數據類型 同理
json 序列化時對字段首字母大小寫的處理
序列化和反序列化時,鍵名的大小寫可能會發生沖突,用json 的tag 解決
package main
import (
"encoding/json"
"fmt"
)
type Monster struct {
Name string `json:"name"` // 反射機制
Age int `json:"age"`
Birthday string `json:"birthday"`
Sal float64 `json:"sal"`
Skill string `json:"skill"`
}
func main() {
monster := Monster{
Name:"牛魔王",
Age:500,
Birthday:"023-1-2",
Sal:8000.0,
Skill:"牛魔拳",
}
// 將map進行序列化
data,err := json.Marshal(monster)
if err != nil{
fmt.Println("序列化失敗",err)
}
fmt.Println(string(data))
}
json的反序列化
package main
import (
"encoding/json"
"fmt"
)
type Monster struct {
Name string `json:"name"`
Age int `json:"age"`
Birthday string `json:"birthday"`
Sal float64 `json:"sal"`
Skill string `json:"skill"`
}
func main() {
monster := Monster{
Name:"牛魔王",
Age:500,
Birthday:"023-1-2",
Sal:8000.0,
Skill:"牛魔拳",
}
// 將map進行序列化
data,err := json.Marshal(monster)
if err != nil{
fmt.Println("序列化失敗",err)
}
dataStr := string(data)
fmt.Println(dataStr)
// 反序列化時,對於需要make的類型,內部源碼已經make過了
err2 := json.Unmarshal([]byte(dataStr),&monster)
if err2 != nil{
fmt.Println("反序列化失敗",err2)
}
fmt.Println(monster)
}
細節
- 在反序列化一個JSON 字符串時,要確保反序列化之后的數據類型和原來序列化前的數據類型(里面的字段)保持一致
