Json是一种比xml更轻量级的数据交换格式,在易于人们阅读编写的同时,也易于程序解析和生成。尽json是JavaScript的一个子集,但json采用完全独立与编程的文本格式,且表现为键值对集合的文本描述形式,这使得他称为较为理想的、跨平台、跨语言的数据交换语言。
开发者可以用json传输简单的字符串、数字、布尔值,也可以传输一个数组,或者一个更复杂的复合结构。在web开发领域中,json被广泛应用于web服务端程序和客户端之间的数据通信。
Go语言内建对json的支持。使用Go语言内置的encoding/json标准库,开发者可以轻松的使用Go程序生成和解析json格式的数据。
1.编码json
【1】通过结构体生成json
package main import ( "encoding/json" "fmt" ) //成员首字母必须大写 type IT struct { Company string `json: "company"` //这样格式化后Company变成company,首字母变小写 Subjects []string Isok bool Price float64 `json: "-"` //-表示不让字段输出在屏幕 Str bool `json:",string"` //表示将这个字段转化为字符串输出 } func main() { //定义一个结构体变量,同时初始化 s := IT{"itcast", []string{"Go", "C++", "Python", "Test"}, true, 666.666, false} //编码,根据内容生成json文本 buf1, err1 := json.Marshal(s) if err1 != nil { fmt.Println(err1) return } //格式化输出,有层次打印json,后两个参数分别为每一行的前缀,每一层的缩进 buf2, err2 := json.MarshalIndent(s, "", "\t") if err2 != nil { fmt.Println(err2) return } fmt.Println("buf1 = ", string(buf1)) fmt.Println("buf2 = ", string(buf2)) }
输出:
【2】通过map生成json
package main import ( "encoding/json" "fmt" ) func main() { //创建一个map m := make(map[string]interface{}, 4) m["company"] = "itcast" m["objects"] = []string{"Go", "Python", "C++", "Test"} m["isok"] = true m["price"] = 666.666 //编码成json result, err := json.MarshalIndent(m, "", "\t") if err != nil { fmt.Println(err) return } fmt.Println("result = ", string(result)) }
输出:
2.解码json
【1】json解析到结构体
package main import ( "encoding/json" "fmt" ) type IT struct { Company string `json: "company"` Subjects []string `json: "subjects"` Isok bool `json: "isok"` Price float64 `json: "price"` } func main() { jsonBuf := ` { "company": "itcast", "subjects": [ "Go", "Python", "C++", "Test" ], "isok": true, "price": 666.666 }` var tmp IT //定义一个结构体变量 err := json.Unmarshal([]byte(jsonBuf), &tmp) //第二个参数要地址传递 if err != nil { fmt.Println(err) return } //fmt.Println("tmp = ", tmp) fmt.Printf("tmp = %+v\n", tmp) type IT2 struct { Subjects []string `json:"subjects"` //只想获取subjects中的数据 } //定义结构体变量 var tmp2 IT2 err2 := json.Unmarshal([]byte(jsonBuf), &tmp2) if err2 != nil { fmt.Println(err2) return } fmt.Printf("tmp2 = %+v\n", tmp2) }
输出:
【2】json解析到map
package main import ( "encoding/json" "fmt" ) type IT struct { Company string `json: "company"` Subjects []string `json: "subjects"` Isok bool `json: "isok"` Price float64 `json: "price"` } func main() { jsonBuf := ` { "company": "itcast", "subjects": [ "Go", "Python", "C++", "Test" ], "isok": true, "price": 666.666 }` m := make(map[string]interface{}, 4) err := json.Unmarshal([]byte(jsonBuf), &m) if err != nil { fmt.Println(err) return } fmt.Printf("m = %+v\n", m) //类型断言 for key, value := range m { switch value.(type) { case string: fmt.Printf("map[%s]的类型为string,value为%v\n", key, value) case bool: fmt.Printf("map[%s]的类型为bool,value为%v\n", key, value) case float64: fmt.Printf("map[%s]的类型为float64,value为%v\n", key, value) case []interface{}: fmt.Printf("map[%s]的类型为[]interface{},value为%v\n", key, value) default: fmt.Println("error") } } }
输出: