1. 程式人生 > 其它 >go語言與JSON

go語言與JSON

技術標籤:gogojson

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)
	}
}