Go 結構體和map等數據結構轉json字符串

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

相關文章
相關標籤/搜索