package
0.0.0-20240927143213-b11bb4fab650
Repository: https://github.com/jocelynh1110/go-practice.git
Documentation: pkg.go.dev
# README
11-2 解碼 JSON 為 Go 結構
解碼JSON:指將 JSON 資料轉換成 Go 的資料型別。
Go 語言會自行將 JSON 值轉成對應的 Go 語言型別,讓我們得以用 Go 語言的方式處理資料。
事先知道 JSON 包含哪些鍵(key),就可以解析(unmarshal)它、再把結果存在一個相對應的 Go 結構中,這得用到 Go 標準函式庫 encoding/json 的 Unmarshal() 函式。
11-2-1 Unmarshal()
func Unmarshal(data []byte, v interface{}) error
- 參數 data([]byte 切片):儲存 JSON 資料的字串。
- v :用來儲存解析結果的變數,其型別為空介面,會傳入一個結構指標。
- Unmarshal() 會解析 JSON 字串,並試著將結果存到該結構中。
- v 不能為 nil,否則會傳回「call of Unmarshal passes non-pointer as second argument」(呼叫 Unmarshal 時傳入非指標)的錯誤。
- 如何將 JSON 資料轉成結構:
package main
import (
"encoding/json"
"fmt"
)
type greeting struct { // 用來儲存解碼的 JSON 資料結構
Message string
}
func main() {
// JSON 資料
data := []byte(`
{
"message":"Greetings fellow gopher!"
}
`)
var v greeting // 建一個空結構 v
err := json.Unmarshal(data, &v) // 解析 JSON 和寫入 v
if err != nil {
fmt.Println(err)
}
fmt.Println(v) // 印出 v 的內容
fmt.Printf("%#v\n", v) // 可看出結構名稱和欄位名稱
}
結果顯示:
{Greetings fellow gopher!}
main.greeting{Message:"Greetings fellow gopher!"}
p.s.結構欄位必須是可匯出的(exportable),也就是名稱首字用英文大寫,才能夠被 Unmarshal() 看到和使用。未匯出(首字小寫)的欄位會被忽略。