JSON(Javascript Object Notation)是一种轻量级的数据交换语言,以文字为基础,具有自我描述性且易于让人阅读。尽管JSON是Javascript的一个子集,但JSON是独立于语言的文本格式,并且采用了类似于C语言家族的一些习惯。JSON与XML最大的不同在于XML是一个完整的标记语言,而JSON不是。JSON由于比XML更小、更快,更易解析,以及浏览器的内建快速解析支持,使得其更适用于网络数据传输领域。目前我们看到很多的开放平台,基本上都是采用了JSON作为他们的数据交互的接口。既然JSON在Web开发中如此重要,那么Go语言对JSON支持的怎么样呢?Go语言的标准库已经非常好的支持了JSON,可以很容易的对JSON数据进行编、解码的工作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
// Go offers built-in support for JSON encoding and // decoding, including to and from built-in and custom // data types. package main import "encoding/json" import "fmt" import "os" // We'll use these two structs to demonstrate encoding and // decoding of custom types below. type Response1 struct { Page int Fruits []string } type Response2 struct { Page int `json:"page"` Fruits []string `json:"fruits"` } func main() { // First we'll look at encoding basic data types to // JSON strings. Here are some examples for atomic // values. bolB, _ := json.Marshal(true) fmt.Println(string(bolB)) intB, _ := json.Marshal(1) fmt.Println(string(intB)) fltB, _ := json.Marshal(2.34) fmt.Println(string(fltB)) strB, _ := json.Marshal("gopher") fmt.Println(string(strB)) // And here are some for slices and maps, which encode // to JSON arrays and objects as you'd expect. 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)) // The JSON package can automatically encode your // custom data types. It will only include exported // fields in the encoded output and will by default // use those names as the JSON keys. res1D := &Response1{ Page: 1, Fruits: []string{"apple", "peach", "pear"}} res1B, _ := json.Marshal(res1D) fmt.Println(string(res1B)) // You can use tags on struct field declarations // to customize the encoded JSON key names. Check the // definition of `Response2` above to see an example // of such tags. res2D := &Response2{ Page: 1, Fruits: []string{"apple", "peach", "pear"}} res2B, _ := json.Marshal(res2D) fmt.Println(string(res2B)) // Now let's look at decoding JSON data into Go // values. Here's an example for a generic data // structure. byt := []byte(`{"num":6.13,"strs":["a","b"]}`) // We need to provide a variable where the JSON // package can put the decoded data. This // `map[string]interface{}` will hold a map of strings // to arbitrary data types. var dat map[string]interface{} // Here's the actual decoding, and a check for // associated errors. if err := json.Unmarshal(byt, &dat); err != nil { panic(err) } fmt.Println(dat) // In order to use the values in the decoded map, // we'll need to cast them to their appropriate type. // For example here we cast the value in `num` to // the expected `float64` type. num := dat["num"].(float64) fmt.Println(num) // Accessing nested data requires a series of // casts. strs := dat["strs"].([]interface{}) str1 := strs[0].(string) fmt.Println(str1) // We can also decode JSON into custom data types. // This has the advantages of adding additional // type-safety to our programs and eliminating the // need for type assertions when accessing the decoded // data. str := `{"page": 1, "fruits": ["apple", "peach"]}` res := &Response2{} json.Unmarshal([]byte(str), &res) fmt.Println(res) fmt.Println(res.Fruits[0]) // In the examples above we always used bytes and // strings as intermediates between the data and // JSON representation on standard out. We can also // stream JSON encodings directly to `os.Writer`s like // `os.Stdout` or even HTTP response bodies. enc := json.NewEncoder(os.Stdout) d := map[string]int{"apple": 5, "lettuce": 7} enc.Encode(d) } |
有疑问加站长微信联系(非本文作者)