1. 程式人生 > 其它 >golang快速入門(九)JSON處理

golang快速入門(九)JSON處理

一、 關於JSON

JSON是一種簡潔、結構清晰的輕量級資料交換格式。基本的JSON型別有數字(十進位制或科學記數法)、布林值(true或false)、字串,其中字串是以雙引號包含的Unicode字元序列。

在python中可通過json.dumps()json.loads()對資料進行編碼(匯出為字串物件)和解碼(匯入為python物件)。

在golang可通過標準庫中的encoding/json中json.Marshal()(編碼)、json.Unmarshal()(解碼)對json資料操作。


二、golang中json編碼與解碼

  • 一個JSON陣列是一個有序的值序列,寫在一個方括號中並以逗號分隔;一個JSON陣列可以用於編碼Go語言的陣列和slice。
  • 一個JSON物件是一個字串到值的對映,寫成一系列的name:value對形式,用花括號包含並以逗號分隔;JSON的物件型別可以用於編碼Go語言的map型別(key型別是字串)和結構體。
1. 將切片、map、編碼為json字串
package main

import (
	"encoding/json"
	"fmt"
	//"os"
)

func main() {
	slcD := []string{"apple", "peach", "pear"}
	slcB, _ := json.Marshal(slcD)
	fmt.Println(string(slcB))

	mapD := map[string]int{"apple": 5, "lettuce": 7}
	mapB, _ := json.Marshal(mapD)
	fmt.Println(string(mapB))
}

//output
[root@VM-0-5-centos course9]# go run json.go
["apple","peach","pear"]
{"apple":5,"lettuce":7}
2.結構體編碼為json
  • 在結構體中可以使用key:"value"標籤如下json:"price"標籤作用於成員調整編碼後的key,使其key為price。因為有些JSON成員名字和Go結構體成員名字並不相同,因此需要Go語言結構體成員Tag來指定對應的JSON名字。
  • 在編碼時,預設使用Go語言結構體的成員名字作為JSON的物件,只有可匯出的成員能進行編碼,即以大寫開頭。
package main

import (
	"encoding/json"
	"fmt"
	//"os"
)

type response1 struct {
	Page   int `json:"price"`
	Fruits []string
}

func main() {
	res1 := &response1{
		Page:   20,
		Fruits: []string{"apple", "peach", "pear"}}
	result, _ := json.Marshal(res1)
	fmt.Println(string(result))
}
//output
[root@VM-0-5-centos course9]# go run json2.go
{"price":20,"Fruits":["apple","peach","pear"]}

3. json 解碼為golang物件

json.Unmarshal([]byte(str), &res) 傳入了一個[]byte()型別字串和一個介面型別引數。關於介面需要在後面學習,這裡可以理解為不確定資料型別。為甚麼不解析為map型別呢?得再思考。

func Unmarshal(data []byte, v interface{}) error

我們建立了一個response2結構體用於接收解析後的資料。在我們建立的結構體中需要做tag處理,否則資料無法對正確應到成員變數。

package main

import (
	"encoding/json"
	"fmt"
	//"os"
)

type response2 struct {
	Page   int `json:"price"`   
	Fruits []string
}

func main() {
	str := `{"page": 1, "fruits": ["apple", "peach"]}`  //golang中 ` 常用於非轉義字串
	res := response2{}
	json.Unmarshal([]byte(str), &res)
	fmt.Println(res)
	fmt.Println(res.Fruits[1])
}
//output
[root@VM-0-5-centos course9]# go run json3.go
{0 [apple peach]}
peach

從輸出來看,序列化後的資料為一個結構體物件res,我們可以通過.開訪問其中資料。


文章有不足的地方歡迎在評論區指出。

歡迎收藏、點贊、提問。關注頂級飲水機管理員,除了管燒熱水,有時還做點別的。