Golang 的 JSON 標準庫(Json package)提供了一系列函數來 Marshal 和 Unmarshal JSON 數據。使用 Go 的 json.Marshal 函數可以將一個值轉換成 JSON 字符串,而使用 json.Unmarshal 可以將 JSON 字符串轉換為一個值。
package main import ( "encoding/json" "fmt" "log" ) type Student struct { Name string `json:"name"` Age int `json:"age"` Gender string `json:"gender,omitempty"` Grades []string `json:"grades"` } func main() { student1 := Student{ Name: "Alice", Age: 20, Grades: []string{ "mathematics", "history", }, } // Marshal data, err := json.Marshal(student1) if err != nil { log.Fatal(err) } fmt.Printf("Marshal: %s\n", data) // Unmarshal var student2 Student err = json.Unmarshal(data, &student2) if err != nil { log.Fatal(err) } fmt.Printf("Unmarshal: %+v\n", student2) }
輸出結果為:
Marshal: {"name":"Alice","age":20,"grades":["mathematics","history"]} Unmarshal: {Name:Alice Age:20 Gender: Grades:[mathematics history]}
除了基本的 Marshal 和 Unmarshal 函數之外,Json 庫還提供了幾個相關的函數和類型。
- json.Decoder:支持逐步解析 JSON 數據流的類型。
- json.Encoder:支持逐步生成 JSON 數據流的類型。
- json.RawMessage:應用于延遲解析 JSON 數據的類型。
在 JSON 數據中,數字、字符串、布爾值和 null 值的表示方法是固定的。但是,對象和數組的表示方法是不固定的,因為它們可能包含不同的鍵值對或元素。因此,對于這些對象和數組的解析,Json 庫提供了幾個可以用來簡化編程的函數。
- json.UnmarshalNumber:可以將字符串表示的數字轉換為 Go 的數值類型。
- json.Unmarshaler:可以實現自定義類型的解析方式。
- json.RawMessage:可以延遲解析 JSON 數據。