go語言與JSON
阿新 • • 發佈:2021-01-18
go語言與JSON
1. 位元組序複習
大端法:高存低,低存高
小端法:高存高,低存低
2. 序列化
func Marshal(v interface{}) ([]byte, error)
- 引數:待序列化的資料
- 返回值:json串
2.1 結構體序列化
-
要求 結構體型別名 和 成員(屬性)名 必須大寫(包作用域),才能在json包中可見。(因為json的函式是在其他包中,必須要讓其他包可見要轉換的結構體)
-
否則,不報錯!但不做序列化轉換。
{“Name”:“張三”,“Age”:29,“Score”:98.9,“Id”:1001}
// 結構體序列化
func StructSerial (v interface{}) {
jStr, err := json.Marshal(v)
if err != nil {
panic(err)
}
fmt.Println(string(jStr))
}
2.2 map序列化
-
定義map變數,不使用make初始化,不能儲存資料
{“Age”:19,“Id”:9527,“Name”:“華安”,“food”:[“雞翅膀”,“含笑半步癲”,“一日散命散”]}
// map 序列化
func MapSerial() {
var m map[string]interface{} // key是string型別, value是自定義資料型別
// 初始化空間
m = make(map[string]interface{}) // 不指定大小可以自動新增後擴容
m["Name"] = "華安"
m["Age"] = 19
m["Id"] = 9527
m["food"] = [3]string{"雞翅膀", "含笑半步癲", "一日散命散"}
jStr, err := json.Marshal(m)
if err != nil {
panic(err)
}
fmt.Println(string(jStr))
}
2.3 slice切片序列化
- 定義一個slice變數可以不初始化, 直接使用append()向其中新增資料, slice本質是一個結構體
[
{
"Age":19,
"Id":9527,
"Name":"華安",
"food":[
"雞翅膀",
"含笑半步癲",
"一日散命散"
]
},
{
"Age":16,
"Id":521,
"Name":"秋香",
"food":[
"雞翅膀",
"一日散命散"
],
"教師":{
"Name":"alin",
"Age":21,
"Addr":"天津"
}
}
]
func SliceSerial() {
// 定義一個map切片
var slice []map[string]interface{}
// 初始化map資料
m1 := make(map[string]interface{})
m1["Name"] = "華安"
m1["Age"] = 19
m1["Id"] = 9527
m1["food"] = [3]string{"雞翅膀", "含笑半步癲", "一日散命散"}
m2 := make(map[string]interface{})
m2["Name"] = "秋香"
m2["Age"] = 16
m2["Id"] = 521
m2["food"] = []string{"雞翅膀", "一日散命散"}
m2["教師"] = Teacher{"alin", 21, "天津"}
slice = append(slice, m1)
slice = append(slice, m2)
jStr, err := json.Marshal(slice)
if err != nil {
panic(err)
}
fmt.Println(string(jStr))
}
3. 結構體標籤
-
用途:在序列化時,重新制定json key值
-
語法:使用反引號包裹。key:value
- key : json、自定義key
- value:必須使用""包裹
`json:"標籤,選項"`
注意:上述語法中不能有空格
標籤後面的選項
-
作用是不進行序列化,omitempty
作用是忽略0和空指string
作用是序列化時型別轉化為字串,序列化後會有""
package main
import (
"encoding/json"
"fmt"
)
//type Student5 struct {
// Name string `json:"stu_name"`
// Age int `json:"stu_age"`
// Score float64
// Id int
//}
type Student5 struct {
Name string `json:"-"` // 序列化結果中沒有這個屬性
Age int `json:"age,omitempty"`
Score float64 `json:"score,string"`
Id int `json:"id"`
}
// 結構體序列化
func StructSerial1(v interface{}) {
jStr, err := json.Marshal(v)
if err != nil {
panic(err)
}
fmt.Println(string(jStr))
}
func main() {
stu := Student5{"張三", 0, 98.9, 1001}
StructSerial1(stu)
}
輸出結果:{"score":"98.9","id":1001}
4. 反序列化
func Unmarshal(data []byte, v interface{}) error
- 引數1:序列化後產生的json串
- 引數2:用來傳出反序列化後的原始資料。使用時傳指標。
- 返回值:一旦err有資料,說明反序列化失敗。
4.1 結構體反序列化
- 用來接收反序列化的結構體型別,不許與原序列化的結構體型別嚴格一致
type Student6 struct {
Name string
Age int
Score float64
Id int
}
type Student7 struct {
Name string `json:"-"` // 序列化結果中沒有這個屬性
Age int `json:"age,omitempty"`
Score float64 `json:"score,string"`
Id int `json:"id"`
}
func StructUnSerial() {
str := `{"Name":"張三","Age":29,"Score":98.9,"Id":1001}`
var stu Student6
err := json.Unmarshal([]byte(str), &stu)
if err != nil {
panic(err)
}
fmt.Println(stu)
}
func StructUnSerial2() {
str := `{"score":"98.9","id":1001}`
var stu Student7
err := json.Unmarshal([]byte(str), &stu)
if err != nil {
panic(err)
}
fmt.Println(stu)
}
func main() {
StructUnSerial()
StructUnSerial2()
}
{張三 29 98.9 1001}
{ 0 98.9 1001}
4.2 map反序列化
Unmarshal函式會幫助我們做map的容量make操作,用來接收的map不用自己make
- 需要傳取地址的map
func MapDeSerial() {
str := `{"Age":19,"Id":9527,"Name":"華安","food":["雞翅膀","含笑半步癲","一日散命散"]}`
var m map[string]interface{}
err := json.Unmarshal([]byte(str), &m)
if err != nil {
panic(err)
}
fmt.Println(m)
}
4.3 slice反序列
- 需要傳入取地址的slice
func SliceDeSerial() {
str := `[
{
"Age":19,
"Id":9527,
"Name":"華安",
"food":[
"雞翅膀",
"含笑半步癲",
"一日散命散"
]
},
{
"Age":16,
"Id":521,
"Name":"秋香",
"food":[
"雞翅膀",
"一日散命散"
],
"教師":{
"Name":"alin",
"Age":21,
"Addr":"天津"
}
}
]`
var slice []map[string]interface{}
err := json.Unmarshal([]byte(str), &slice)
if err != nil {
panic(err)
}
for _, data := range slice {
fmt.Println(data)
}
}