Go語言中使用json包中的 Marshal() 函數將數據結構轉成json字符串,源代碼:json
func Marshal(v interface{}) ([]byte, error) { e := newEncodeState() err := e.marshal(v, encOpts{escapeHTML: true}) if err != nil { return nil, err } buf := append([]byte(nil), e.Bytes()...) e.Reset() encodeStatePool.Put(e) return buf, nil }
該函數接收一個參數 接口形式的參數(若是參數定義成接口類型)則能夠接收任何參數。有兩個返回值:字符切片、錯誤。數據結構
結構體轉json:app
package main import ( "encoding/json" "fmt" ) //建立結構體 type Student struct { Id int Name string Address []string IsWork bool } //封裝返回結構體實例的方法 func (s *Student) setStudentInfo(id int,name string,address []string, iswork bool) { s.Address = address s.Id = id s.IsWork = iswork s.Name = name } //封裝返回結構體實例的方法 返回結構體的指針 func getStudentInfo(id int,name string,address []string, iswork bool) *Student { return &Student{id,name,address,iswork} } func main() { var s Student //初始化結構體 s.setStudentInfo(12,"jack",[]string{"sh","bj"},false) //將結構體轉成json result , err := json.Marshal(s) if err != nil { fmt.Println("error") } fmt.Printf("result = %+v\n",string(result)) stu := getStudentInfo(13,"tom",[]string{"北京","上海","深圳"},true) fmt.Printf("type is %T\n",stu) fmt.Printf("student = %+v\n",stu) //獲取結構體的name屬性 原本是指針,可是能夠直接獲取其屬性,這是go語言的語法糖 fmt.Println("stu.Name = ",stu.Name) fmt.Println("(*stu).Name = ",(*stu).Name) result2,err2 := json.Marshal(stu) if err2 != nil { fmt.Println("error") } fmt.Println(string(result2)) }
map轉json:函數
package main import ( "encoding/json" "fmt" ) func main() { m := make(map[string]interface{}) m["name"] = "jack" m["address"] = []string{"北京","河南"} m["iswork"] = false m["age"] = 18 result,err := json.Marshal(m) if err !=nil { fmt.Println("error") } fmt.Println(string(result)) }
json轉結構體:指針
package main import ( "encoding/json" "fmt" ) /** json轉結構體 */ func main() { //json串 內包含 一個切片 一個 int類型的age 一個bool類型的iswork 和一個 字符串類型的name jsonStr := `{"Address":["北京","河南"],"Age":18,"Iswork":false,"Name":"jack"}` var p Person json.Unmarshal([]byte(jsonStr),&p) fmt.Printf(" p = %+v\n",p) } //定義結構體 //結構體的名字首字母必定要大寫,否則解析不出來 type Person struct { Name string Age int Iswork bool Address []string }
json轉map:code
package main import ( "encoding/json" "fmt" ) func main() { //json串 內包含 一個切片 一個 int類型的age 一個bool類型的iswork 和一個 字符串類型的name jsonStr := `{"Address":["北京","河南"],"Age":18,"Iswork":false,"Name":"jack"}` m := make(map[string]interface{}) json.Unmarshal([]byte(jsonStr),&m) //fmt.Println(m) //fmt.Printf("m = %+v\n",m) for key,value := range m{ //fmt.Printf("m[%s] = %+v\n",key,value) //if key == "Address" { // fmt.Printf("%T\n",value)//得出類型爲接口類型 []interface {} 本來爲 切片類型 //} //經過斷言 推出數據的類型 switch data := value.(type) { case string: fmt.Printf("m[%s] = %s\n",key,data) case float64: fmt.Printf("m[%s] = %f\n",key,data) case bool: fmt.Printf("m[%s] = %v\n",key,data) case []string: fmt.Println("是字符串切片類型") case []interface{}: fmt.Printf("是接口切片類型: %s =====> %v\n",key,data) fmt.Println("======開始遍歷切片======") for index,v := range data{ fmt.Printf("%s[%d] = %s\n",key,index,v) } fmt.Println("======遍歷切片結束======") } } }
若是不經過斷言去判斷類型,若是須要遍歷json串內切片的數據就沒辦法操做了。blog