本篇内容主要讲解“如何使用Go语言JSON 标准库”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用Go语言JSON 标准库”吧! 序列化序列化使用 json 库中的 func Marshal(v interface{}) ([]byte, error) 1. 结构体序列化比如使用以下的结构体表示一部电影: type Movie struct { Title string Year int `json:"released"` Color bool `json:"color,omitempty"` Actors []string } 定义里类型后面跟的字符串
没有 field tags 时进行序列化的一些规则:
进行序列化的代码如下: movie := Movie{ Title: "Casablanca", Year: 1942, Color: false, Actors: []string{"Humphrey Bogart", "Ingrid Bergman"}, } data, err := json.Marshal(movie)if err != nil { log.Fatalf("JSON marshaling failed: %s", err) } fmt.Printf("%s\n", data) 输出:
2. 字典序列化一个字典要想序列化成- JSON 格式,它的 key 必须是字符串。 以下是一个例子: info := map[string]int{"width": 1280,"height": 720, } data, err := json.MarshalIndent(info, "", " ")if err != nil { log.Fatalf("JSON marshaling failed: %s", err) } fmt.Printf("%s\n", data) 输出:
这里我们使用 3. 切片序列化直接看一个例子: type Movie struct { Title string Year int `json:"released"` Color bool `json:"color,omitempty"` Actors []string }var movies = []Movie{ { Title: "Casablanca", Year: 1942, Color: false, Actors: []string{"Humphrey Bogart", "Ingrid Bergman"}, }, { Title: "Cool Hand Luke", Year: 1967, Color: true, Actors: []string{"Paul Newman"}, }, { Title: "Bullitt", Year: 1968, Color: true, Actors: []string{"Steve McQueen", "Jacqueline Bisset"}, }, } data, err := json.MarshalIndent(movies, "", " ")if err != nil { log.Fatalf("JSON marshaling failed: %s", err) } fmt.Printf("%s\n", data) 输出:
反序列化反序列化使用 func Unmarshal(data []byte, v interface{}) error 1. 明确知道 JSON 格式我们要先将 JSON 格式表示为一个确定的类型。 1.如下的 JSON 格式: {"name": "Awesome 4K","resolutions": [ {"width": 1280,"height": 720 }, {"width": 1920,"height": 1080 }, {"width": 3840,"height": 2160 } ] } 我们可以用如下结构体来表示它: struct { Name string Resolutions []struct { Width int Height int } } 2.如下的 JSON 格式: { "height": 720, "width": 1280} 也可以使用 3.如下的 JSON 格式: [ {"width": 1280,"height": 720 }, {"width": 1920,"height": 1080 }, {"width": 3840,"height": 2160 } ] 使用切片 不管怎样,一个确定的JSON格式总是可以使用切片、结构体或字典来表示。 之后就可以执行反序列化了: var jsonBlob = []byte(` [ {"width": 1280,"height": 720 }, {"width": 1920,"height": 1080, }, {"width": 3840,"height": 2160 }] `) di := []map[string]int{} err = json.Unmarshal(jsonBlob, &di)if err != nil { fmt.Println("error:", err) } fmt.Printf("%+v\n", di) 输出
2. 无法确定 JSON 格式无法确定的格式可以直接使用 具体看一个示例: package mainimport ("encoding/json" "fmt")func main() {var jsonBlob = []byte(` { "name": "Awesome 4K", "price": 1999.9, "resolutions": [ { "width": 1280, "height": 720 }, { "width": 1920, "height": 1080 }, { "width": 3840, "height": 2160 } ] } `)var d interface{} err := json.Unmarshal(jsonBlob, &d)if err != nil { fmt.Println("error:", err) } fmt.Println(d) m := d.(map[string]interface{})for k, v := range m {switch vv := v.(type) {case string: fmt.Println(k, "is string", vv)case float64: fmt.Println(k, "is float64", vv)case []interface{}: fmt.Println(k, "is an array:")for i, u := range vv { fmt.Println(i, u) }default: fmt.Println(k, "is of a type I don't know how to handle") } } } 输出:
|
|