Go 結構體struct、字典map 與 json的相互轉換

編碼

結構體 -> json

// 結構體 -> json
package main

import (
	"encoding/json"
	"fmt"
)

// 結構體 -> json
type IT struct {
	Company  string
	Subjects []string
	IsOk     bool
	Price    float64
}

func main() {
	t1 := IT{"lianshi",[]string{"Go","Python","Java"},true,998.08}

	// 正常的,將結構體 轉化爲 json
	//b, err := json.Marshal(t1)

	// 可以輸出漂亮的,帶格式的 json 字符串  (是一個切片 []uint8 byte )
	b, err := json.MarshalIndent(t1,"","  ")
	fmt.Printf("%T\n",b) // []uint8
	if err !=nil{
		fmt.Println("json err",err)
	}
	fmt.Printf(string(b))

}

字典 -> json

// 字典 -> json
package main

import (
	"encoding/json"
	"fmt"
)

func main(){
	// 生成一個字典,值的類型是一個空接口,表示可以存所有值
	m := make(map[string]interface{})
	m["Name"] = "sun"
	m["Age"] = 33
	m["Score"] = []int{100,100,98}
	m["Addr"] = "內蒙古自治區"

	//slice,err := json.Marshal(m)
	slice, err := json.MarshalIndent(m,"","\t" )
	if err != nil {
		fmt.Println("json 轉換失敗",err)
	}

	fmt.Println(string(slice))
}

解碼

json -> 結構體

// json -> 結構體
package main

import (
	"encoding/json"
	"fmt"
)

// Name 必須大寫,否則json->結構體 這個字段無法解析
// json:"name" 解析成json後,Name的名稱爲name
type Student struct {
	Name string `json:"name"`
	Addr string `json:"addr"`
	Age  int    `json:"age"`
	Score []int `json:"score"`
}


func main() {
	slice :=[]byte(`{
        "Addr": "內蒙古自治區",
        "Age": 33,
        "Name": "sun",
        "Score": [
                100,
                100,
                98
        ]
}
`)

	var student Student
	// 這裏第二個參數,一定是一個地址
	err := json.Unmarshal(slice,&student)
	if err != nil{
		fmt.Println("失敗")
	} else {
		fmt.Printf("%+v\n",student)
	}
}

json -> 字典

// json -> 字典
package main

import (
	"encoding/json"
	"fmt"
)


func main() {

	// 生成json
	slice :=[]byte(`{
        "Addr": "內蒙古自治區",
        "Age": 33,
        "Name": "sun",
        "Score": [
                100,
                100,
                98
        ]
}
`)

	var i interface{}
	err := json.Unmarshal(slice,&i)
	if err != nil{
		fmt.Println(err)
	} else {
		fmt.Println(i)
		// map[Addr:內蒙古自治區 Age:33 Name:sun Score:[100 100 98]]
	}

	// 獲取map裏的數據
	m := i.(map[string]interface{})
	fmt.Println(m)
	fmt.Printf("%T\n",m)
	// 已經知道了裏面有Name
	fmt.Println(m["Name"])

	// 遍歷字典
	for _, v := range m {
		//fmt.Println(k, v)
		//fmt.Printf("%T\n", v)

		// 因爲我們的類型 都是 接口類型 interface
		// 所以可以使用 v.(type) 獲取該值的具體類型
		switch val := v.(type) {
		// 網上有人說 這個只能是接口類型 而且只能用在switch中
			case string:
				fmt.Println("string:", val)
			case float64:
				fmt.Println("float64", val)
			case []interface{}:
				//fmt.Println("[]int", val)
				for i, value := range val {
					fmt.Println(i, value)
					fmt.Printf("%T\n",value)
				}
		}
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章