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)
				}
		}
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章