golang快速入門(九)JSON處理
阿新 • • 發佈:2021-06-15
一、 關於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,我們可以通過.
開訪問其中資料。
文章有不足的地方歡迎在評論區指出。
歡迎收藏、點贊、提問。關注頂級飲水機管理員,除了管燒熱水,有時還做點別的。